对具有默认命名空间的文档执行XPath查询

时间:2011-03-21 03:11:42

标签: c# .net xml xpath

  

可能重复:
  Using Xpath With Default Namespace in C#

您好,

我很难在恶魔般的XML上为集成组件做xpath。问题是某些节点是名称空间前缀而其他节点不是。

我有一个示例XML,它声明了一个默认的ns,然后是一些特定的NS用于其他元素:

<?xml version="1.0" encoding="UTF-8"?>
<Header xmlns="http://namespaceFoo.com">
    <MessageID>1300121668281</MessageID>
    <OriginIdentificaton>
        <Code>2050302</Code>
    </OriginIdentificaton>
    <PatientData>
        <ns1:Identificacao xmlns:ns1="http://namespaceBAR.com">
            <ns1:SSN>123456789</ns1:SSN>
            <ns1:Name>Johnny john</ns1:Name>
        </ns1:Identificacao>
        <ns2:Diagnosis xmlns:ns2="http://namespaceBAR.com"/>
        <ns3:Contacts xmlns:ns3="http://namespaceBAR.com"/>
        <ns4:Benefits xmlns:ns4="http://namespaceBAR.com"/>
    </PatientData>
</Header>

我正试图用以下内容查询:

XmlDocument xmlData = new XmlDocument and LoadXml()
XmlNamespaceManager xmlnsManager = new XmlNamespaceManager(xmlData.NameTable);
xmlnsManager.AddNamespace(String.Empty, "http://namespaceFoo.com");
XmlNode n1 = xmlData.SelectSingleNode("/Header");

返回Null。

我完全迷失了。我尝试过几种名称空间和xpath查询组合无济于事。

这不应该简单吗?有没有办法查询“/ Element1 / Element2 / ...”而不管这些元素的命名空间是什么?

由于

1 个答案:

答案 0 :(得分:1)

你真是太近了!您需要首先为空命名空间赋予“假”前缀(下面的第一行),然后将XmlNamespaceManager传递给SelectSingleNode函数。

xmlnsManager.AddNamespace("x", "http://namespaceFoo.com");
XmlNode n1 = xmlData.SelectSingleNode("/Header", xmlnsManager);