选择命名空间在 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 节点?

选择命名空间在 WCF 中的请求之间更改的 XML 节点

只要节点始终使用相同的命名空间(它们在您的示例中就是这样),前缀是什么并不重要。 您只需要确保在进行选择时为命名空间正确创建前缀>命名空间映射:

以下代码应按原样适用于两个示例 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'])