我有一些xml,我想使用xpath(使用C#)
选择密码节点<?xml version='1.0' encoding='utf-16'?>
<s:Envelope xmlns:s='http://schemas.xmlsoap.org/soap/envelope/'>
<s:Body>
<Search xmlns='https://temp.org'>
<context>
<Password>MyS3cretP@ssword</Password>
<UserID>MyUserId</UserID>
</context>
</Search>
</s:Body>
</s:Envelope>
以下代码找不到节点,我不知道原因。我认为它与某些具有已定义命名空间的xml有关,有些则使用默认命名空间。
var doc = new XmlDocument();
doc.LoadXml(request);
var nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/");
var node = doc.SelectSingleNode("/s:Envelope/s:Body/Search/context/Password", nsmgr);
如果不更改xml的内容,我该如何选择Password节点?
答案 0 :(得分:1)
它找不到节点,因为Search
节点及其中的所有节点都在https://temp.org
命名空间中。您需要在命名空间管理器和XPath中考虑到这一点:
var doc = new XmlDocument();
doc.LoadXml(request);
var nsMgr = new XmlNamespaceManager(doc.NameTable);
nsMgr.AddNamespace("s", "http://schemas.xmlsoap.org/soap/envelope/");
nsMgr.AddNamespace("t", "https://temp.org");
var node = doc.SelectSingleNode("/s:Envelope/s:Body/t:Search/t:context/t:Password", nsMgr);