【问题标题】:XPath does not work for selecting in XMLXPath 不适用于在 XML 中进行选择
【发布时间】:2015-09-17 20:16:28
【问题描述】:

我有一个 XML 文档,在我的一生中,我无法使用 XPath 获取数据。我已经尝试了我能找到的每一个样本,但没有运气。我正在尝试提取电子邮件地址。有什么想法吗?

XML:

<?xml version="1.0" encoding="UTF-8"?>
<Document xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:hl7-org:v3" xsi:schemaLocation="urn:hl7-org:v3 CDA.xsd">
    <typeId root="test1" extension="test2"/>
        <id root="test3" extension="test4"/>
            <code code="test5" codeSystem="test6" />
            <effectiveTime value="201509171214"/>
            <confidentialityCode code="N" codeSystem="test7" codeSystemName="test8" displayName="normal"/>
            <languageCode code="en"/>
            <recordTarget>
                <Role>
                    <id root="000000" extension="number1"/>
                    <id root="11111" extension="number2"/>
                    <addr>
                        <streetAddressLine>Street</streetAddressLine>
                        <postalCode>12345</postalCode>
                        <city>City</city>
                        <state>STATE</state>
                        <country>COUNTRY</country>
                    </addr>
                    <telecom value="number" use="HP"/>
                    <telecom value="number" use="MC"/>
                    <telecom value="email@email"/>
                    <person>
                        <name>
                            <family>family</family>
                            <given>given</given>
                            <prefix/>
                            <suffix/>
                        </name>
                        <administrativeGenderCode code="C" codeSystem="code" codeSystemName="code name" displayName="c"/>
                        <birthTime value="N/A"/>
                    </person>
                </Role>
            </recordTarget>
</Document>

要加载它:

XmlDocument xmlDocument = new XmlDocument();
xmlDocument.LoadXml(STRING DATA FROM XML);

XPathNavigator foo = xmlDocument.CreateNavigator();
foo.MoveToFollowing(XPathNodeType.Element);
foo.Select("Document/recordTarget/Role");

我也试过了:

XmlNodeList xmlNodeList = xmlDocument.SelectNodes("/Document/recordTarget/Role");

但这些都不起作用。一切都空了回来。有任何想法吗?我似乎无法越过根目录。

我也尝试在选择中添加命名空间管理器,但没有成功。

XmlNamespaceManager manager = new XmlNamespaceManager(xmlDocument.NameTable);

【问题讨论】:

  • 请修复这个混乱的格式..
  • 可能与命名空间有关。只是为了确保删除 xmlns="urn:hl7-org:v3" 然后尝试
  • 它确实与名称空间部分有关。从文档节点中删除命名空间信息后,我尝试了您的代码,并且 xpath 代码按您的预期工作。

标签: c# xml xpath xmldocument


【解决方案1】:

你必须添加一个命名空间

XPathNavigator navigator = xmlDocument.CreateNavigator();
XmlNamespaceManager manager = new XmlNamespaceManager(navigator.NameTable);
manager.AddNamespace("ns", "urn:hl7-org:v3");

var role = navigator.Select("/ns:Document/ns:recordTarget/ns:Role", manager);

【讨论】:

  • 当我在 OP 的 xml 上使用此示例时,我能够获得角色。
【解决方案2】:

试试这个:

//Create a namespacemanager to get the defaultnamespace of the xml document    
XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDocument.NameTable);

//XPath to find the tag that the value isn't equals to number, in this case, it will 
//return the <telecom value="email@email"/> element
String xpathQuery = "//role//telecom[@value!='number']"; 

如果你打算使用 XPath 来获取一些属性值,在 XPathNavigator foo = xmlDocument.CreateNavigator(); 之后你应该 使用 SelectSingleNode 方法:

//from the XPathNavigator object, we call the SelectSingleNode method, to select a single 
//node using the specified xpath query and then call the GetAttribute method to finally
//get the value attribute from that element
String email = foo.SelectSingleNode(xpathQuery).GetAttribute"value",nsmgr.DefaultNamespace); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-28
    • 2021-04-14
    • 1970-01-01
    • 1970-01-01
    • 2016-06-15
    • 2014-02-02
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多