2009-08-12 4 views
2

ich eine stark Namespace SOAP-Nachricht zu analysieren versuchen (Quelle kann auch here zu finden):Parst und Abfrage SOAP in C#

<?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> 

Nur für den Kontext, ist dies eine Antwort von MM7 Senden Nachricht .

Wie kann ich die folgenden Werte erhalten:

TransactionID, Statuscode, Statustext, MessageID

Ich versuchte Linq-Xml aber kein Glück, wenn die Abfrage einen Wert wie enthält "soapenv: Body".

+0

Ich bin neugierig. Anstatt die Nachricht zu analysieren, warum nicht eine Service-Referenz verwenden? –

+0

@John, können Sie das ausarbeiten? –

+0

Verwenden Sie den Befehl "Dienstverweis hinzufügen", um einen Dienstverweis für den Dienst zu erstellen, der diese Daten zurückgibt. Dann können Sie es wie eine Methode bezeichnen und die Elemente wie Klassen mit Eigenschaften verarbeiten. –

Antwort

3

Wenn Sie versuchen, ein mit einem Namespace zu erstellen, müssen Sie es aus einem XNamespace plus eine Zeichenfolge, z.

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

Wenn Sie dann die XName "body" mit Linq-to-XML verwenden, wird es das <soapenv:Body> Element in Ihrem Dokument überein.

Sie können ähnliche Schritte ausführen, um die Namen anderer Elemente mit Namespaces zu erstellen.

0

Ich denke, Sie müssen XmlDocument (zum Lesen der XML) und XmlNamespaceManager (für die erneute Bereitstellung der Namespace-Daten) verwenden und XPath-Abfragen von diesen Objekten verwenden.

3

Es gibt einen noch einfacheren Weg. Sie können den Namespace einfach mit der {} -Notation angeben:

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;