2009-08-12 8 views
2

Je suis en train d'analyser un message SOAP fortement espaces de noms (source se trouvent également here):Parse et SOAP requête en 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> 

Juste pour le contexte, ceci est une réponse de MM7 Envoyer un message .

Comment puis-je obtenir les valeurs suivantes:

TransactionID, StatusCode, StatusText, messageid

J'ai essayé Linq-Xml, mais pas de chance lorsque la requête comprend une valeur comme "soapenv: Body".

+0

Je suis curieux. Plutôt que d'analyser le message, pourquoi ne pas utiliser une référence de service? –

+0

@John, pouvez-vous élaborer? –

+0

Utilisez la commande "Ajouter une référence de service" pour créer une référence de service au service renvoyant ces données. Ensuite, vous pouvez l'appeler comme une méthode et traiter les éléments comme des classes avec des propriétés. –

Répondre

3

Si vous essayez de créer un XName avec un espace de noms, vous devez le construire à partir d'un XNamespace plus une chaîne, par ex.

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

Ensuite, lorsque vous utilisez le XName « body » avec LINQ to XML il correspondra à l'élément <soapenv:Body> dans votre document.

Vous pouvez faire des choses similaires pour permettre de construire les noms d'autres éléments avec des espaces de noms.

0

Je pense que vous devrez utiliser XmlDocument (pour lire le XML) et XmlNamespaceManager (pour récupérer les données de l'espace de noms) et utiliser les requêtes XPath de ces objets.

3

Il existe un moyen encore plus simple. Vous pouvez simplement spécifier l'espace de noms en ligne en utilisant la notation {}:

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;