无法在具有两个命名空间的XML上使用XmlDocument.SelectSingleNode

时间:2013-10-11 16:25:53

标签: c# xml xpath xml-namespaces

我试图解析以下XML:

<?xml version="1.0" encoding="utf-8"?>
<A2AAnf:MPPPPPP xsi:schemaLocation="urn:A2AAnf:xsd:$MPPPPPP.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:A2AAnf="urn:A2AAnf:xsd:$MPPPPPP">
<A2AAnf:Num>0</A2AAnf:Num>
<A2AAnf:FIT xmlns="urn:iso:std:iso:20022:xsd:003.001">
    <Hdr>
        <Inf>
            <Mtd>TEST</Mtd>
        </Inf>
    </Hdr>
</A2AAnf:FIT>

我想访问<Mtd>标记。
XMLQuire显示路径为/A2AAnf:MPPPPPP/A2AAnf:FIT/dft:Hdr/dft:Inf/dft:Mtd,但是当我尝试使用以下代码解析它时:

XmlDocument xmldocument = new XmlDocument();
var xmlNameSpaceManager = new XmlNamespaceManager(xmldocument.NameTable);
xmlNameSpaceManager.AddNamespace("A2AAnf", "urn:A2AAnf:xsd:$MPPPPPP");
   try
   {
     xmldocument.LoadXml(m_XML);
     var node = xmldocument.SelectSingleNode("/A2AAnf:MPPPPPP/A2AAnf:FIT/dft:Hdr/dft:Inf/dft:Mtd", xmlNameSpaceManager);
   }

我收到以下错误:

  

名称空间前缀&#39; dft&#39;未定义

因为我无法找到&#34; dft&#34;在我的XML中,我也试图删除&#34; dft&#34;前缀并搜索没有&#34; dft&#34;的相同字符串。这一次,没有任何回报。

我错过了什么?

1 个答案:

答案 0 :(得分:1)

您必须将dft添加到XmlNamespaceManager

var xmlNameSpaceManager = new XmlNamespaceManager(xmldocument.NameTable);
xmlNameSpaceManager.AddNamespace("A2AAnf", "urn:A2AAnf:xsd:$MPPPPPP");
xmlNameSpaceManager.AddNamespace("dft", "urn:iso:std:iso:20022:xsd:003.001");

您在XPath查询中使用的前缀与XML文档中使用的前缀无关。它们是您在XmlNamespaceManager中定义的前缀。