如何引用具有两个命名空间定义的xml节点?

时间:2015-02-22 18:08:08

标签: c# xml

我有来自第三方的xml消息,该消息有一个节点:

<ClinicalDocument xmlns="urn:hl7-org:v3" xmlns:npfitlc="NPFIT:HL7:Localisation" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
classCode="DOCCLIN" moodCode="EVN">

我创建了一个Namespace对象,用于识别此节点下的npfitlc项:

ns.AddNamespace("npfitlc", "NPFIT:HL7:Localisation");

但是当我尝试选择ClinicalDocument节点时,它无法找到它:

XmlNode myNode = soapEnvelop.SelectSingleNode
        ("//soap:Envelope/soap:Body/itk:DistributionEnvelope/itk:payloads/itk:
        payload/ClinicalDocument", ns);

正如您在我的文档中看到的,有多个节点可以访问临床文档。当我向下引用itk:payload时,它定位很好:

XmlNode myNode = soapEnvelop.SelectSingleNode
       ("//soap:Envelope/soap:Body/itk:DistributionEnvelope/itk:
       payloads/itk:payload", ns);

我从ClinicalDocument标签中取出xmlns="urn:hl7-org:v3",然后我发现它可以通过我的SelectSingleNode调用找到,但是我发送消息的系统验证失败,因为缺少了。

我不确定如何在该节点中定义"root"命名空间的情况下处理它。

1 个答案:

答案 0 :(得分:3)

ClinicalDocument没有前缀,它有一个xmlns="urn:hl7-org:v3"命名空间声明,这意味着它的命名空间是urn:hl7-org:v3。其余的命名空间声明与选择此特定元素的目的完全无关。

所以你需要做的是......

将该命名空间添加到命名空间管理器(使用任何非空前缀):

ns.AddNamespace("hl", "urn:hl7-org:v3");

在XPath中使用该前缀:

XmlNode myNode = 
    soapEnvelop.SelectSingleNode("//soap:Envelope/soap:Body" + 
                                  "/itk:DistributionEnvelope/itk:payloads" + 
                                  "/itk:payload/hl:ClinicalDocument", ns);

那应该这样做。