2

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

ns2:errorCode および ns2:message を取得するための正しい XPATH 式を取得できません。私はたくさんの答えを読んだので、これで遊んでいきますが、時間が短くなってきています。

Windows では perl 5.16 を使用していますが、solaris では perl 5.8.4 にデプロイする予定です。XML::LibXML も使用しています。

4

1 に答える 1

2

XPath ステートメントから「*」を削除できてよかったです。より詳細な説明を提供できると思います。元の XPath ステートメントは、ルート ノードの 1 レベル下を探していましたns2:errorCodens2:messageXPath からアスタリスクを削除し、//ショートカットを使用して検索を開始すると、実際にはドキュメント全体で要素名ns2:errorCodens2:message.

余談ですが、パーサーはすべての要素を処理する必要があるため、これは実際には効率的ではありません。より効率的な XPath ステートメントは/soapenv:Envelope/soapenv:Body/ns2:Fault/detail/ns2:InternalSystemErrorException/ns2:errorCodeandns2:messageです。完全なパスを指定することで、パーサーにノードを探す場所を正確に伝えます。このページのポイント 9 をご覧ください。

于 2013-06-20T03:26:45.010 に答える