我需要在perl中解析SOAP响应:

<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 $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";


我无法获取正确的XPATH表达式来获取ns2:errorCode和ns2:message。我已经阅读了很多答案,并且会继续使用,但是时间越来越短。

我在Windows下使用Perl 5.16,但计划在solaris下在Perl 5.8.4上进行部署。我也在使用XML :: LibXML。

最佳答案

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

一方面,由于解析器必须遍历所有元素,因此实际上效率较低。更有效的XPath语句是/soapenv:Envelope/soapenv:Body/ns2:Fault/detail/ns2:InternalSystemErrorException/ns2:errorCodens2:message。通过指定完整路径,您将告诉解析器确切的位置来查找节点。看一下this page上的#9点。

关于perl - 使用LibXML在perl中解析SOAP响应,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17202138/

10-11 17:20