【问题标题】:Select XML node where namespace is changing between requests in WCF在 WCF 中的请求之间选择命名空间正在更改的 XML 节点
【发布时间】:2013-01-23 10:34:33
【问题描述】:

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

【问题讨论】:

  • 变化的不是命名空间(http://schemas.xmlsoap.org/soap/envelope/),而是命名空间前缀(从ssoapenv)。

标签: c# xml wcf namespaces request


【解决方案1】:

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

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

Working ideone example

【讨论】:

  • 嗨。谢谢,我也是这么想的,一开始我也是这么想的——但它没有用,这就是我发帖的目的。让我再检查一下,如果我没有犯一些简单的错误
  • 呵呵。问题出在我的 Xpath 语句中。我正在选择 xmlReq.SelectSingleNode("bd:Body", ns) - 结果为空!但这不应该选择文档中的所有 Body 节点吗?
  • 不,bd:Body 只会选择上下文节点正下方的正文节点。 //bd:Body 将选择文档中的所有 Body 节点。
【解决方案2】:

如果您使用 XPATH 选择节点,您可以在选择节点时忽略命名空间(以及它的缩写前缀),通过在 local-name() 的基础上进行选择。以下 SO 文章中有一个示例:-

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

count(/*[local-name() = 'Envelope']/*[local-name() = 'Body'])

【讨论】:

  • 尚未检查该解决方案,但很有趣。我会看看。谢谢回答
  • 没有问题。如果有用,+1 会很棒:) 我正在努力赚 2k。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-24
  • 2012-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多