我正在尝试使用 .NET 解析 c# .NET 中的有效 XML 文档xPathNavigator
。XML 文档的开头如下所示:
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:myResponse xmlns:ns1="ExampleNS" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<myReturn href="#2" />
如您所见,在根元素上定义了一些命名空间,但稍后ns1
会定义。当我尝试评估 xPath 查询时/soapenv:Envelope/soapenv:Body/ns1:myResponse/myReturn
,我得到XPathException
:
Namespace prefix 'ns1' is not defined.
我正在做的是将 XML 文档作为字符串加载到XmlDocument
对象中。然后我正在创建一个导航器,移动到根元素并调用GetNamespacesInScope(XmlNamespaceScope.All)
. 我遍历这个集合,其中包含根上定义的、、和的命名空间,并将它们添加到命名空间xml
管理器soapenv
。然后我创建一个并调用,并得到异常。xsd
xsi
xPathNavigator
Evaluate
代码是这样的:
string response = GetXMLString();
var xmlDocument = new XmlDocument();
xmlDocument.LoadXml(response);
var xmlDocumentNavigator = xmlDocument.CreateNavigator();
xmlDocumentNavigator.MoveToFollowing(XPathNodeType.Element);
var xnm = new XmlNamespaceManager(xmlDocument.NameTable);
var namespacesInScope = xmlDocumentNavigator.GetNamespacesInScope(XmlNamespaceScope.All);
if (namespacesInScope != null)
{
foreach (var prefix in namespacesInScope.Keys)
{
xnm.AddNamespace(prefix, namespacesInScope[prefix]);
}
}
var xPathDocument = new XPathDocument(new StringReader(response));
var xPathNavigator = xPathDocument.CreateNavigator();
xPathNavigator.Evaluate("/soapenv:Envelope/soapenv:Body/ns1:myResponse/myReturn", xnm);
为什么GetNamespacesInScope
方法不接ns1
?