Анализирайте и заявете 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
Използвайте командата Add Service Reference, за да създадете препратка към услугата, която връща тези данни. След това можете да го извикате като метод и да обработвате елементите като класове със свойства.   -  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