具有默认和非默认命名空间混合的XPath选择节点

时间:2018-01-05 12:00:16

标签: c# xml xpath

我有一些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节点?

1 个答案:

答案 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);