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

C# 选择名称空间在WCF中请求之间更改的XML节点,c#,xml,wcf,namespaces,request,C#,Xml,Wcf,Namespaces,Request,我必须从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-wssecurit

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

如果使用XPATH选择节点,则可以在选择节点时忽略名称空间(及其缩写前缀),方法是基于
local-name()
进行选择。以下SO文章中有一个例子:-

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

count(/*[local-name() = 'Envelope']/*[local-name() = '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);

它不是名称空间(
http://schemas.xmlsoap.org/soap/envelope/
),但名称空间前缀(从
s
soapenv
)。您好。谢谢,我的想法完全一样,一开始我也是这么想的——但是没有用,这就是我这篇文章的目的。让我再检查一下,如果我没有犯一些简单的错误,呵呵。问题其实出在我的Xpath语句中。我正在选择xmlReq.SelectSingleNode(“bd:Body”,ns)-这会给出空结果!但是这不应该选择文档中的所有正文节点吗?不,
bd:Body
将只选择上下文节点正下方的正文节点
//bd:Body
将选择文档中的所有Body节点。尚未检查该解决方案,但很有趣。我来看看。谢谢你的回答,没问题。如果有用的话,a+1就太好了:)我试着做2k。