选择命名空间在 WCF 中的请求之间更改的 XML 节点
本文关键字:XML 节点 之间 请求 WCF 选择 命名空间 | 更新日期: 2023-09-27 17:55:30
我必须从WCF请求中选择特定的节点OperationContext.Current.RequestContext.RequestMessage.ToString()
问题是命名空间正在更改请求之间的前缀:
所以一旦是:
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Body>
</s:Body>
</s:Envelope>
其他时间是:
<soapenv:Envelope xmlns:mes="MessageContracts" xmlns:req="RequestMessages" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Body>
</soapenv:Body>
</soapenv:Envelope>
如何确保始终正确获取 Body 节点?
只要节点始终使用相同的命名空间(它们在您的示例中就是这样),前缀是什么并不重要。 您只需要确保在进行选择时为命名空间正确创建前缀>命名空间映射:
以下代码应按原样适用于两个示例 xml:
// assuming XmlDocument doc has already been loaded with the XML response
XmlNamespaceManager nsm = new XmlNamespaceManager(doc.NameTable);
nsm.AddNamespace("soap", "http://schemas.xmlsoap.org/soap/envelope/");
XmlNode body = doc.SelectSingleNode("/soap:Envelope/soap:Body", nsm);
工作 ideone 示例
如果使用 XPATH 选择节点,则可以在选择节点时忽略命名空间(及其缩写前缀),方法是根据 local-name()
进行选择。在下面的SO文章中有一个示例:-
- 如何使用 XPath 忽略命名空间
对于上面的 XML 文档,以下 Xpath 查询将返回两个文档的计数 1。
count(/*[local-name() = 'Envelope']/*[local-name() = 'Body'])