【问题标题】:Parsing SOAP response in perl with LibXML使用 LibXML 在 perl 中解析 SOAP 响应
【发布时间】:2013-06-19 22:00:44
【问题描述】:

我需要在 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。

【问题讨论】:

  • 您不使用 SOAP::Lite 或 XML::Compile::SOAP 是否有原因?他们应该负责为您解析 SOAP 响应。
  • 这个答案有帮助吗? stackoverflow.com/questions/7041719/…
  • 我尝试了 SOAP::Lite 但无法发送参数(在 WS 上总是收到 null)。所以最后有人与我分享了一个直接请求 LWP::UserAgent 的代码。所以我就这样走了,现在我想解析响应。其他的lib没试过,我去看看
  • @Joel,看看那个答案是我如何得到当前代码的。但我仍然无法获得这些值。
  • @adrianmoya 如果从 XPath 语句中删除“*”会怎样?这给了你什么?

标签: perl xpath xml-libxml


【解决方案1】:

我很高兴从 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 点。

【讨论】:

  • (当然,您需要使用registerNssoapenv 与正确的命名空间相关联。)
  • 而且ns2在文档的不同层级有不同的URI,所以其中一个必须注册和使用除了ns2之外的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-26
  • 1970-01-01
相关资源
最近更新 更多