Pergunta

Eu estou tentando analisar uma mensagem SOAP fortemente namespaced (fonte pode ser encontrada também aqui ):

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

Apenas para o contexto, esta é uma resposta de MM7 Submeter mensagem.

Como posso obter os seguintes valores:

TransactionID, StatusCode, StatusText, MessageID

Eu tentei Linq para XML, mas sem sorte quando a consulta inclui um valor semelhante. "Soapenv: Body"

Foi útil?

Solução

Se você está tentando construir uma XName com um namespace que você precisa para construí-lo a partir de um XNamespace além de uma corda, por exemplo.

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

Em seguida, quando você usa o XName "body" com Linq para XML que irá coincidir com o elemento <soapenv:Body> no documento.

Você pode fazer coisas semelhantes a permitem construir os nomes de outros elementos com namespaces.

Outras dicas

Há uma maneira ainda mais simples. Você pode simplesmente especificar a linha namespace usando {} notação:

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;

Eu acho que você vai precisar usar XmlDocument (para a leitura do XML) e XmlNamespaceManager (para retreiving os dados namespace) e usando consultas XPath a partir desses objetos.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top