1

我必须从 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 节点?

4

2 回答 2

0

如果您使用 XPATH 选择节点,您可以在选择节点时忽略命名空间(及其缩写前缀),方法是在local-name(). 以下 SO 文章中有一个示例:-

对于上面的 XML 文档,以下 Xpath 查询将为两个文档返回计数 1。

count(/*[local-name() = 'Envelope']/*[local-name() = 'Body'])
于 2013-01-23T10:37:48.947 回答
0

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

以下代码应该适用于您的两个示例 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);

工作理念示例

于 2013-01-23T10:38:32.690 回答