2012-03-09 3 views
0

Ненавижу быть деревенским идиотом, но я не знаю, как работает Linq to XML. Я знаю, что это должно быть похоже на запись SQL-запроса, но я просто не могу обернуть его вокруг. Я пытаюсь получить данные из строки XML. Я не хочу использовать XMLDocuments и XPath для этого. Я мог бы это сделать, я сделал это, я пытаюсь сделать свое приложение немного более злым. XML, который у меня есть, немного ожесточен, но я смог использовать Xpath для его анализа. Linq to XML должно быть намного проще. Из следующего XML мне нужно получить все элементы и привязать их к объекту POCO. Например, мне нужно установить объект Patient.PatientId с атрибутом value (4563) узла элемента с атрибутом имени PatientID. Теперь я понял, как это сделать, используя XmlDocument. Но я не могу для жизни понять, как это сделать с LINQ to XML? Что я могу сделать? У меня есть пример того, что я пытаюсь сделать ниже xml, который вызывает у меня проблемы.Получение значений из XML с использованием LINQ to XML

<?xml version="1.0" encoding="utf-8"?> 
<dataTemplateSpecification id="id1" name="name1" > 
    <templates xmlns=""> 
    <template> 
     <elements> 
     <element id="element0" name="PatientId" display="Patient ID" dataType="String" visable="true" readOnly="false" value="4563"> 
      <mapping path="//Template/TemplateData/ACOData/PATIENT_ID" /> 
      <validation> 
      <rules> 
       <rule id="r0" test="#element0.value == ''"> 
       <fail> 
        <html> 
        <b>Patient ID is null, value must be present</b> 
        </html> 
       </fail> 
       </rule> 
      </rules> 
      </validation> 
     </element> 
     <element id="element1" name="PopulationPatientID" display="Population Patient ID" dataType="String" visable="true" readOnly="true" enc="2098" value="6407"> 
      <mapping path="//Template/TemplateData/ACOData/POPULATION_PATIENT_ID" /> 
      <!--Patient/compositeID[./idType='populationPatientID']/id--> 
      <validation> 
      <rules> 
       <rule id="r1" test="#element1.value == ''"> 
       <fail> 
        <html> 
        <b>EMPI ID is null, value must be present</b> 
        </html> 
       </fail> 
       </rule> 
      </rules> 
      </validation> 
     </element> 

Снова, вот LINQ to XML, который я пытаюсь использовать.

TemplateModel template = (TemplateModel)(from templates in elem.XPathSelectElements("//templates/template") 
select new PatientACOData 
{ 
     PatientId = templates.Elements("//element/element[@name='PatientId']").Attributes("value").Value; 

}); 

UPDATE >>> В приведенном выше примере CLASS определение было немного) SIMPLE ... Вот соответствующее определение класса ...

class PatientClass 
{ 
    public int Item_ID { get; set; } 
    public int PatientId { get; set; } 
    public int EMPIID { get; set; } 
    //public int PopulationPatientID { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public DateTime DateOfBirth { get; set; } 
    public string Phone { get; set; } 
    public string HostpitalFinNumber { get; set; } 
    public DateTime AdminDate { get; set; } 
    public string MRNType { get; set; } 
    public string MRN { get; set; } 
    public string PatientRoomPhone { get; set; } 
    public DateTime DischargeDateTime { get; set; } 
    public string DischargeDisposition { get; set; } 
    public string DischargeTo { get; set; } 
    public char DischargeAdvocateCall { get; set; } 
    public string Payor { get; set; } 
    public char HomeHealthCareAccepted { get; set; } 
    public char SafeLandingAccepted { get; set; } 
    public string PCPName { get; set; } 
    public string PCPPhone { get; set; } 
    public string SpecialistName { get; set; } 
    public string SpecialistPhone { get; set; } 
    public DateTime PCPAppointmentDateTime { get; set; } 
    public string PCPAppointmentLocation { get; set; } 
    public DateTime SpecialistAppointmentDateTime { get; set; } 
    public string SpecialistAppointmentLocation { get; set; } 
    public char CompletedPathway { get; set; } 
    public string CompletedPathwayReason { get; set; } 
    public string Comment { get; set; } 
} 
+0

Действительно ли это актуально для вас? Какой результат вы ожидаете? – sll

+0

Не уверен, что вы имеете в виду. Я пытаюсь вытащить данные из этого XML в объект данных. Я пытаюсь несколько разных способов, но препятствие для меня заключается в изучении linq для XML. – SoftwareSavant

+0

Пожалуйста, поделитесь определением класса «объект данных» – sll

ответ

1

По вашей XML я бы заполнить PatientClass следующим образом:

var xml = XElement.Load("XMLFile1.xml"); 

var patients = from template in xml.Element("templates").Elements("template") 
       select new PatientClass 
       { 
        PatientId = (from element in template.Element("elements").Elements("element") 
           where element.Attribute("name").Value == "PatientId" 
           select (int)element.Attribute("value")).FirstOrDefault() 

       }; 
Смежные вопросы