2

I need to parse a SOAP response in perl:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Header xmlns:iden="http://identifycaller.customermanagement.schema.amx.com"/>
   <soapenv:Body xmlns:iden="http://identifycaller.customermanagement.schema.amx.com">
      <ns2:Fault xmlns:ns2="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns3="http://www.w3.org/2003/05/soap-envelope">
         <faultcode>ns2:server</faultcode>
         <faultstring>Error interno del servicio. Por favor contacte al administrador.    </faultstring>
         <detail>
            <ns2:InternalSystemErrorException xmlns:ns2="http://commonsexceptions.schema.amx.com">
               <ns2:errorCode>1049581</ns2:errorCode>
               <ns2:errorMsg>Error tecnico</ns2:errorMsg>
               <ns2:message>Error interno del servicio. Por favor contacte al administrador.</ns2:message>
            </ns2:InternalSystemErrorException>
         </detail>
      </ns2:Fault>
   </soapenv:Body>
</soapenv:Envelope>

My code:

my $xml = $response->content;
my $dom = XML::LibXML->load_xml( string => (\$xml) );        

my $xpc = XML::LibXML::XPathContext->new($dom);
$xpc->registerNs('ns2', 'http://commonsexceptions.schema.amx.com');

my $errorCode = $xpc->findvalue('/*/ns2:errorCode');
my $errorMessage = $xpc->findvalue('/*/ns2:message');

print "Codigo $errorCode: $errorMessage\n";

I am unable to get the correct XPATH expression to get ns2:errorCode and ns2:message. I've read lots of answers and will continue playing with this but time is getting short.

I'm using perl 5.16 under windows but plan to deploy on perl 5.8.4 under solaris. I'm also using XML::LibXML.

4

1 回答 1

2

我很高兴从 XPath 语句中删除 '*' 有效。我相信我可以提供更详细的解释。您原来的 XPath 语句正在寻找根节点下的一层ns2:errorCodens2:message通过从 XPath 中删除星号并使用//快捷方式开始搜索,您实际上是在整个文档中搜索任何元素名称ns2:errorCodens2:message.

一方面,这实际上效率较低,因为解析器必须遍历所有元素。更有效的 XPath 语句是/soapenv:Envelope/soapenv:Body/ns2:Fault/detail/ns2:InternalSystemErrorException/ns2:errorCodeand ns2:message。通过指定完整路径,您可以准确地告诉解析器在哪里寻找您的节点。看看这个页面上的第 9 点。

于 2013-06-20T03:26:45.010 回答