【发布时间】:2015-02-11 08:16:54
【问题描述】:
我有下面的 XML,我一直在尝试提取 FirstName、LastName 和 OtherName 一段时间,现在我遇到了各种各样的问题。
<OmdCds xmlns="cds"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:cdsd="cds_dt"
xsi:schemaLocation="cds ontariomd_cds.xsd">
<PatientRecord>
<Demographics>
<Names>
<cdsd:LegalName namePurpose="L">
<cdsd:FirstName>
<cdsd:Part>SARAH</cdsd:Part>
<cdsd:PartType>GIV</cdsd:PartType>
<cdsd:PartQualifier>BR</cdsd:PartQualifier>
</cdsd:FirstName>
<cdsd:LastName>
<cdsd:Part>GOMEZ</cdsd:Part>
<cdsd:PartType>FAMC</cdsd:PartType>
<cdsd:PartQualifier>BR</cdsd:PartQualifier>
</cdsd:LastName>
<cdsd:OtherName>
<cdsd:Part>GABRIELA</cdsd:Part>
<cdsd:PartType>GIV</cdsd:PartType>
<cdsd:PartQualifier>BR</PartQualifier>
我目前尝试使用以下 c# 代码进行提取,但仍无法提取上述数据。我得到一个空引用异常。
XmlDocument doc = new XmlDocument();
doc.Load(folder + "\\" + o.ToString());
XmlNamespaceManager namespaceManager = new XmlNamespaceManager(doc.NameTable);
namespaceManager.AddNamespace("cdsd", "http://www.w3.org/2001/XMLSchema-instance");
XmlNode firstName = doc.DocumentElement.SelectSingleNode("/PatientRecord/Demographics/Names/cdsd:LegalName/cdsd:FirstName/cdsd:Part", namespaceManager);
string fName = firstName.InnerText;
MessageBox.Show(fName);
我可以在 doc.DocumentElement 下的本地监视项中看到所有 InnerXML 和 InnerText。 InnerXML 看起来像这样...
<PatientRecord xmlns=\"cds\"><Demographics><Names><cdsd:LegalName namePurpose=\"L\" xmlns:cdsd=\"cds_dt\"><cdsd:FirstName><cdsd:Part>SARAH</cdsd:Part><cdsd:PartType>GIV</cdsd:PartType><cdsd:PartQualifier>BR</cdsd:PartQualifier></cdsd:FirstName>
【问题讨论】:
-
您有使用 XmlDocument 吗?使用 LINQ to XML 通常可以更简单地处理命名空间。此外,如果您以后可以多注意格式化您的代码和愉快地采样 XML,它会更容易为您提供帮助。
-
你可以试试没有命名空间的xpath吗? XmlNode firstName = doc.DocumentElement.SelectSingleNode("/PatientRecord/Demographics/Names/LegalName/FirstName/Part");
-
这里的许多答案都错过了他们的 xPath 的一个关键字符。 xPath 像这样开始“./cds:PatientRecord/ - 错过了让我发疯的时期,直到我阅读并意识到时期(.)丢失了。
标签: c# xml xml-namespaces