2016-11-10 14 views
0

私は試してみましたが、解決策を考え出すことができませんでした。私はその後、私のMac上で、このような要素にアクセス...私は次のようであるSOAPエンベロープ応答を有するすべてのXMLNSでSOAPエンベロープ解析 - Magentoで動作していません

<soapenv:envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:header> 
     <soapenv:body> 
      <mcu:prescreenusereligibilityresponse xmlns:mcu="http://www.ups.com/XMLSchema/XOLTWS/MCUserEligibility/v1.0"> 
       <common:response xmlns:common="http://www.ups.com/XMLSchema/XOLTWS/Common/v1.0"> 
        <common:responsestatus> 
         <common:code>1</common:code> 
         <common:description>Success</common:description> 
        </common:responsestatus> 
       </common:response> 
       <mcu:eligibilitystatuscode>3</mcu:eligibilitystatuscode> 
      </mcu:prescreenusereligibilityresponse> 
     </soapenv:body> 
    </soapenv:header> 
</soapenv:envelope> 

:私の問題はこれです

に同じ方法を使用し
$ns=array(); 
$xml=new SimpleXMLElement($string); 
foreach($xml->getNamespaces(true) as $key=>$url){ 
    $xml->registerXPathNamespace($key, $url); 
    $ns[]=strval($url); 

} 
print_r(strval($xml->children($ns[0])->header->body->children($ns[1])->prescreenusereligibilityresponse->eligibilitystatuscode)); 

別のLinuxインスタンスprint_r行にエラーが表示され、最後の子をnullにすることはできません。私は値が正しいことを確認しました。私も$xml->xpath('//mcu:eligibilitystatuscode')を使ってみると成功しませんでした。

は、私は本当にあなたはそれがあなたのMac上ではなく、Linux上で動作すると言うことを考えると-_-

答えて

1

代替手段を使用しました。 DOMDocument() 異なるオブジェクトノードを画面に印刷した後、xml文字列の大文字と小文字が異なることに気付きました。名前空間を適切な大文字と比較しようとしましたが、SimpleXMLを使用しても成功しませんでした。

$doc = new DOMDocument(); 

      $doc->loadXML($result); 
      if($doc){ 
       foreach($doc->getElementsByTagNameNS('*', '*') as $element){ 
        if($element->tagName=='mcu:EligibilityStatusCode'){ 
         if($element->nodeValue==0){ 
          return true; 
         } 
         else{ 
          return false; 
         } 
        } 
       } 
       return false; 
      } 
      else{ 
       return false; 
      } 

上記はワーキングコードで、resultはSOAPリクエストから返されたxmlです。私のコードは基本的にXMLレスポンスの各ノードを循環します。 Magentoフロントエンドのブロックに表示されます。

0

をこだわって、行末が問題にされている可能性があります。これを追加して、可能なすべての行末を、XMLを解析する前に実行しているシステムのデフォルトに置き換えてください。

$string = preg_replace('~\R~u', PHP_EOL, $string); 
+0

同じ結果。私はかなり確実に 'trim($ string)'は終わりの文字を取り除くでしょう。 (私も試しました) –

+0

@DrewPetersonトリムは、各行ではなく、文字列全体の開始/終了時にのみ空白を取り除きます。 –

関連する問題