我有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>
答案 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;