Parse et SOAP de requête en C #
-
13-09-2019 - |
Question
Je suis en train d'analyser un message SOAP fortement espaces de noms (source se trouve aussi ):
<?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 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"
.La solution
Si vous essayez de construire un XName
avec un espace de noms dont vous avez besoin pour le construire à partir d'un XNamespace
plus d'une chaîne, par exemple.
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 la construction des noms d'autres éléments avec des espaces de noms.
Autres conseils
Il y a une façon encore plus simple. Vous pouvez simplement spécifier la ligne en utilisant l'espace de noms 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;
Je pense que vous aurez besoin d'utiliser XmlDocument (pour lire le XML) et XmlNamespaceManager (pour retreiving les données d'espace de noms) et l'utilisation de requêtes XPath de ces objets.