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 に答える