12
<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
  <s:Head>
    <h:talkId s:mustknow="1" xmlns:h="urn:schemas-test:testgate:hotel:2012-06">
      sfasfasfasfsfsf</h:talkId>
    </s:Head>
  <s:Body>
    <bookHotelResponse xmlns="urn:schemas-test:testgate:hotel:2012-06" xmlns:d="http://someURL" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
      <d:bookingReference>123456</d:bookingReference>
      <d:bookingStatus>successful</d:bookingStatus>
      <d:price xmlns:p="moreURL">
        <d:total>105</d:total>
      </d:price>
    </bookHotelResponse>
  </s:Body>
</s:Envelope>

XmlDocumentC#を使用して上記のSOAPメッセージを読み込もうとしています。

XmlDocument document = new XmlDocument();
document.LoadXml(soapmessage);  //loading soap message as string
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable);

manager.AddNamespace("d", "http://someURL");

XmlNodeList xnList = document.SelectNodes("//bookHotelResponse", manager);
int nodes = xnList.Count;

foreach (XmlNode xn in xnList)
{
    Status = xn["d:bookingStatus"].InnerText;
}

カウントは常にゼロであり、bookingstatus値を読み取っていません。

4

4 に答える 4

16

BookHotelResponseは名前空間urn:schemas-test:testgate:hotel:2012-06(サンプルxmlのデフォルトの名前空間)にあるため、クエリでその名前空間を指定する必要があります。

XmlDocument document = new XmlDocument(); 
document.LoadXml(soapmessage);  //loading soap message as string 
XmlNamespaceManager manager = new XmlNamespaceManager(document.NameTable); 

manager.AddNamespace("d", "http://someURL"); 
manager.AddNamespace("bhr", "urn:schemas-test:testgate:hotel:2012-06"); 

XmlNodeList xnList = document.SelectNodes("//bhr:bookHotelResponse", manager); 
int nodes = xnList.Count; 

foreach (XmlNode xn in xnList) 
{ 
    Status = xn["d:bookingStatus"].InnerText; 
} 
于 2012-08-30T17:08:47.697 に答える
3

使用するLINQ2XML

BookingStatusを読むには、これを行います

XElement doc = XElement.Load("yourStream.xml");
XNamespace s = "http://schemas.xmlsoap.org/soap/envelope/";//Envelop namespace s
XNamespace bhr="urn:schemas-test:testgate:hotel:2012-06";//bookHotelResponse namespace
XNamespace d="http://someURL";//d namespace

foreach (var itm in doc.Descendants(s + "Body").Descendants(bhr+"bookHotelResponse"))
{
itm.Element(d+"bookingStatus").Value;//your bookingStatus value
}

LINQ2XMLはクールですが....:)

于 2012-08-30T17:03:57.080 に答える
2

まず、xml値を非セラライズするクラスを作成します

    public class bookHotelResponse {
      public int bookingReference { get; set; }
      public int bookingStatus { get; set; }
   } 

次にGetElementsByTagName、soapリクエストの本文を抽出し、リクエスト文字列をオブジェクトに非正規化するために利用できます。

    private static T DeserializeInnerSoapObject<T>(string soapResponse)
    {
        XmlDocument xmlDocument = new XmlDocument();
        xmlDocument.LoadXml(soapResponse);

        var soapBody = xmlDocument.GetElementsByTagName("soap:Body")[0];
        string innerObject = soapBody.InnerXml;

        XmlSerializer deserializer = new XmlSerializer(typeof(T));

        using (StringReader reader = new StringReader(innerObject))
        {
            return (T)deserializer.Deserialize(reader);
        }
    }
于 2016-05-01T16:56:29.307 に答える
1

私が理解しているように、あなたは石鹸サービスからの応答を得たいと思っています。その場合、このすべてのハードワーク(呼び出し、xmlの解析、応答値を取得するためのノードの選択)を自分で行う必要はありません...代わりに、プロジェクトにサービス参照を追加する必要があります。クラスの生成、asmx呼び出しの作成など、残りの作業を行います。詳細については、https: //msdn.microsoft.com/en-us/library/bb628649.aspxを参照してください。

参照を追加した後に行う必要があるのは、次のようなクラスメソッドを呼び出すことだけです。

var latestRates = (new GateSoapClient())?.ExchangeRatesLatest();
return latestRates?.Rates;
于 2018-03-26T07:45:11.530 に答える