Анализировать и запрашивать SOAP в C#

Я пытаюсь разобрать сообщение SOAP с большим количеством имен (источник также можно найти здесь):

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
 <soapenv:Header>
  <ns1:TransactionID soapenv:mustUnderstand="1" xsi:type="xsd:string" xmlns:ns1="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2">0a00f556419041c08d8479fbaad02a3c</ns1:TransactionID>
 </soapenv:Header>
 <soapenv:Body>
  <SubmitRsp xmlns="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2">
   <MM7Version>5.3.0</MM7Version>
   <Status>
    <StatusCode xsi:type="ns2:responseStatusType_StatusCode" xmlns:ns2="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2" xmlns="">1000</StatusCode>
    <StatusText xsi:type="ns3:statusTextType" xmlns:ns3="http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2" xmlns="">Success</StatusText>
   </Status>
   <MessageID>B08CF7B847DAD89C752334BDEBB69B5B</MessageID>
  </SubmitRsp>
 </soapenv:Body>
</soapenv:Envelope>

Просто для контекста: это ответ на сообщение MM7 Submit.

Как я могу получить следующие значения:

TransactionID, StatusCode, StatusText, MessageID

Я попробовал Linq-Xml, но не повезло, когда запрос включает значение типа «soapenv:Body».


person Ron Klein    schedule 12.08.2009    source источник
comment
Мне любопытно. Вместо разбора сообщения, почему бы не использовать ссылку на службу?   -  person John Saunders    schedule 12.08.2009
comment
Используйте команду «Добавить ссылку на службу», чтобы создать ссылку на службу, возвращающую эти данные. Затем вы можете вызывать его как метод и обрабатывать элементы как классы со свойствами.   -  person John Saunders    schedule 13.08.2009
comment
Я знаю об этом варианте, но сервис не предоставляет ни wsdl, ни disco.   -  person Ron Klein    schedule 13.08.2009
comment
Спасибо за публикацию XML. Я поковырялся на сайте www.3gpp.org. Я бы не поверил, что какая-либо организация могла сказать следующее в 2009 году: эта контрольная точка должна основываться на SOAP 1.1 [68] и сообщениях SOAP с вложениями [69] с использованием транспортного уровня HTTP. Будущие версии могут обновить это решение по протоколу, чтобы использовать стандартизированную версию SOAP и поддерживать дополнительные реализации транспортного уровня. Это может быть первый раз, когда я вижу, что организация преднамеренно использует нестандартный SOAP.   -  person John Saunders    schedule 13.08.2009


Ответы (3)


Если вы пытаетесь создать XName с пространством имен, вам нужно построить его из XNamespace плюс строка, например.

XNamespace soapenv = "http://schemas.xmlsoap.org/soap/envelope/";
XName body = soapenv + "Body";

Затем, когда вы используете XName "body" с Linq-to-XML, он будет соответствовать элементу <soapenv:Body> в вашем документе.

Вы можете делать подобные вещи, чтобы создавать имена других элементов с пространствами имен.

person Greg Beech    schedule 12.08.2009

Есть еще более простой способ. Вы можете просто указать встроенное пространство имен, используя нотацию {}:

var soap = XElement.Load(soapPath);
var transactionID = 
        from e in soap.Descendants("{http://www.3gpp.org/ftp/Specs/archive/23_series/23.140/schema/REL-5-MM7-1-2}TransactionID")
        select e.Value;
person Winston Smith    schedule 12.08.2009

Я думаю, вам нужно будет использовать XmlDocument (для чтения XML) и XmlNamespaceManager (для получения данных пространства имен) и использовать запросы XPath от этих объектов.

person Russell    schedule 12.08.2009