我需要在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: $errorMessagen";
我无法获得正确的XPATH表达式来获取ns2:errorCode和ns2:message。我已经读了很多答案,我会继续玩这个,但时间越来越短。
我在windows下使用perl 5.16,但计划在solaris下部署perl 5.8.4。我也使用XML::LibXML
我很高兴从XPath语句中删除'*'成功了。我相信我可以提供更详细的解释。您最初的XPath语句是在根节点下一层查找ns2:errorCode
和ns2:message
。通过从XPath中删除星号并使用//
快捷方式开始搜索,您实际上是在搜索整个文档中任何名称为ns2:errorCode
和ns2:message
的元素。
/soapenv:Envelope/soapenv:Body/ns2:Fault/detail/ns2:InternalSystemErrorException/ns2:errorCode
和ns2:message
。通过指定完整路径,您可以告诉解析器在哪里查找节点。请看本页第9点