我想知道是否有一種方法可以使用Linq將XML從xml字符串中取出對象數組... 我習慣於使用XPath來執行我所有的骯髒的工作,和Xpath似乎很直觀。但是,我一直聽說linq有多棒,一旦你掌握了它,那麼它會讓你的生活變得更輕鬆。陪審團仍然在那一個,但是,然後再次,我對Linq不是那麼好。仍在學習。但是假設我有一個對象...使用linq獲取XML對象數組
class PatientClass
{
//public int Item_ID { get; set; }
public int PatientId { get; set; }
public int EMPIID { get; set; }
}
假設我有另一個對象...
public class TemplateModel
{
List<PatientACOModel> Template { set; get; }
}
這簡直就是第一對象的列表...
假設我有一個XML文件,看起來像這樣...
<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" />
</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" />
</element>
<element id="element2" name="EMPIID" display="EMPIID" dataType="String" visable="true" readOnly="true" value="">
<mapping path="//Template/TemplateData/ACOData/EMPI" />
</element>
</elements>
</template>
<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" />
</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" />
</element>
<element id="element2" name="EMPIID" display="EMPIID" dataType="String" visable="true" readOnly="true" value="">
<mapping path="//Template/TemplateData/ACOData/EMPI" />
</element>
</elements>
</template>
<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" />
</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" />
</element>
<element id="element2" name="EMPIID" display="EMPIID" dataType="String" visable="true" readOnly="true" value="">
<mapping path="//Template/TemplateData/ACOData/EMPI" />
</element>
</elements>
</template>
</templates>
</dataTemplateSpecification>
你看,dataTemplateSpecification /模板/模板將是一個我上面的PatientClass的實例。而dataTemplateSpecification/templates /將是TemplateModel對象的一個實例(PatientClasses的一個列表...我在List中將它們命名爲PatientACOModel,但它們基本上是同一個東西......一個變量沒有像另一個)。
現在我使用它來解析出病人對象...
IEnumerable<PatientClass> template = (IEnumerable<PatientClass>)(from templates in xDocument.Descendants("dataTemplateSpecification")//elem.XPathSelectElements(string.Format("//templates/template[./elements/element[@name=\"PopulationPatientID\"and @value='{0}' and @enc='{1}']]", "1", 0))
select new PatientClass
{
PatientId = int.Parse(templates.Descendants("element").Single(el => el.Attribute("name").Value=="PatientId").ToString()),//XPathSelectElement("elements/element[@name='PatientId']").Attribute("value").Value),
EMPIID = int.Parse(templates.Descendants("element").Single(el => el.Attribute("name").Value=="EMPIID").ToString()),//XPathSelectElement("elements/element[@name='EMPIID']").Attribute("value").Value),
}
這是目前返回空值,但我的工作對...但我怎樣才能使這些病人的列表。我可能需要一個超級查詢來處理東西和子查詢列表以獲取患者信息的權利?
因此,像這樣......
IEnumerable<TemplateModel> template = (IEnumerable<TemplateModel>)(from templates in elem.XPathSelectElements("//templates/template")
select new TemplateModel
{
TemplateModel =
(from pat in templates
select new PatientClass
{
PatientId = int.Parse(templates.XPathSelectElement("elements/element[@name='PatientId']").Attribute("value").Value),
EMPIID = int.Parse(templates.XPathSelectElement("elements/element[@name='EMPIID']").Attribute("value").Value),
)
}
這似乎合乎邏輯的我。但也許我不明白Linq的基礎
是有一些原因,你不只是序列化在你的對象標準方式? – 2012-03-13 14:39:38
這將是一個嚴重醜陋的對象。出於某種原因,我的建築師是這種XML模式的忠實粉絲。這可能與我們所在的行業有關。 – SoftwareSavant 2012-03-13 15:11:49
一種可能性是使用XSL將數據從元數據規範轉換爲更具體的某個元素(即一個名爲PatientID的元素,其值爲any,而不是規範要被稱爲PatientID的元素)。然後,您可以使用XML序列化將其轉換爲對象。但我猜這是元數據到具體的任何步驟,這是殺手,對吧? – 2012-03-13 16:00:50