使用LINQ解析复杂XML

时间:2013-07-01 20:28:45

标签: c# linq linq-to-xml

我有CDA XML我正在尝试使用LINQ解析和查询它。但是,我无法检索这些值。

我正在尝试以下LINQ代码:

var cdafile = XDocument.Load("cda.xml");

var patientCity = from c in cdafile.Elements("recordTarget")
                                   .Elements("patientRole")
                                   .Elements("addr")
                  select (string)c.Element("city").Value;

我在patientCity中获得空值。我做错了吗?

<?xml version="1.0" encoding="UTF-8"?>
<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:sdtc="urn:hl7-org:sdtc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:hl7-org:v3 http://xreg2.nist.gov:8080/hitspValidation/schema/cdar2c32/infrastructure/cda/C32_CDA.xsd">
  <realmCode code="US"/>
  <title>Cypress C32 Patient Test Record: Nelson Tuff</title>
  <recordTarget>
    <patientRole>
      <id root="Cypress" extension="4fe1ecbca9ffcc03cd0004e3"/>
      <addr use="HP">
        <streetAddressLine>202 Burlington Rd.</streetAddressLine>
        <city>Bedford</city>
        <state>MA</state>
        <postalCode>01730</postalCode>
      </addr>
      <telecom value="tel:+1-781-271-3000"/>
      <patient>
        <name>
          <given>George</given>
          <family>Mathew</family>
        </name>
      </patient>
    </patientRole>
  </recordTarget>
</ClinicalDocument>

1 个答案:

答案 0 :(得分:2)

您需要在查询(urn:hl7-org:v3)中包含默认命名空间,并在Root中查询XDocument属性:

XNamespace ns = "urn:hl7-org:v3";
var patientCity = 
    from c in cdafile.Root
        .Elements(ns + "recordTarget")
        .Elements(ns + "patientRole")
        .Elements(ns + "addr") 
    select (string)c.Element(ns + "city").Value;

这是因为Elements搜索节点的直接子节目(在XDocument的情况下,文件本身只有ClinicalDocument的直接子节点)。

您可以使用Descendants搜索当前节点的任何后代,完全忽略分层行走:

var patientCity = from c in cdafile.Descendants(ns + "city") select c.Value;