2016-07-31 9 views
2

名前空間を含むXMLを抽出しようとしました。私はこれを自分自身で理解しようとしました。私は何をしているのか、何が間違っているのかを正確に特定することはできません。XML名前空間 - どのように取得するのですか?

私は変数$myXMLDataにこのセットを持っている、とtitle属性吐き出すために、次のコードを実行:

$myXMLData=<<<XML 
<getmatchingproductresponse xmlns="http://mws.amazonservices.com/schema/Products/2011-10-01"> 
    <getmatchingproductresult asin="055726328X" status="Success"> 
    <product> 
     <attributesets> 
     <ns2:itemattributes xmlns:ns2="http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd" xml:lang="en-US"> 
      <ns2:studio>lulu.com</ns2:studio> 
      <ns2:title>You Are a Spiritual Healer</ns2:title> 
     </ns2:itemattributes> 
     </attributesets> 
     <relationships> 
     </relationships> 
    </product> 
    </getmatchingproductresult> 
    <responsemetadata> 
    <requestid>4304bf06-acd2-4792-804a-394a2e01656f</requestid> 
    </responsemetadata> 
</getmatchingproductresponse> 

XML; 

$sxe=new SimpleXMLElement($myXMLData); 
$sxe->registerXPathNamespace('ns','http://mws.amazonservices.com/schema/Products/2011-10-01'); 
$result=$sxe->xpath('//ns:title'); 
foreach ($result as $title) 
    { 
    echo $title . "<br>"; 
    } 

をしかし、私の出力は空白です。私はここで間違って何をしていますか?助けてください...!

答えて

2

あなたはnopasteに間違った名前空間を登録しました。この文書には2つの名前空間があります。プレフィックスNS2

titleと接頭

  • http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd
    要素なし

    • http://mws.amazonservices.com/schema/Products/2011-10-01
      要素は、接頭辞ns2を使用します。ドキュメントで使用されている接頭辞を登録する必要はありません。あなたは自分自身を登録することができます。 SimpleXMLでは、xpath()メソッドを呼びたい要素の上でこれを行う必要があります。これは小さな関数を作成するのに役立ちます。

      $xmlns = [ 
          'p' => 'http://mws.amazonservices.com/schema/Products/2011-10-01', 
          'pd' => 'http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd' 
      ]; 
      
      function registerNamespacesOnElement(
          SimpleXMLElement $element, array $namespaces 
      ) { 
          foreach ($namespaces as $prefix => $namespace) { 
          $element->registerXpathNamespace($prefix, $namespace); 
          } 
      } 
      
      $sxe=new SimpleXMLElement($xml); 
      registerNamespacesOnElement($sxe, $xmlns); 
      $result=$sxe->xpath('//pd:title'); 
      foreach ($result as $title) { 
          echo $title . "<br>\n"; 
      } 
      

      出力:

      You Are a Spiritual Healer<br> 
      
  • +0

    こんにちは@ThW、 私はアマゾンのAPIコールが始まりとXMLの最後に '<<< XML'と' XML'を持っていない実現私のコードを使用しようとしましたが、私はまだlocalhost上で空の画面を表示しています:(おそらく、eval.inとは違うかもしれませんが... API呼び出し自体にはすでに 'XML'タグはすでに配置されていますか? – 8bitmagic

    +0

    $ variable = <<< KEYWORD ... KEYWORD;はPHPや他の言語(Perlなど)で使用される特別な文字列構文で、エスケープの少ない複数行の文字列を指定できます。 '$ variable =" ... "'にシンボリック構文を適用します。 – ThW

    +0

    この場合、$変数を解析することができますか?なぜこの場合にはうまくいかなかったのでしょうか? – 8bitmagic

    0

    ヘッダーtext/xmlに設定しましたか?デフォルトでPHPはContent-Typeをtext/htmlに設定しているので、ブラウザはXMLのようにHTMLを表示しようとします。だからあなたはおそらく空白の結果を得るのです。

    これを追加してみてください:

    header('Content-Type: text/xml'); 
    
    0
    // Register namespace, set in xml declaration 
    $sxe->registerXPathNamespace('ns2','http://mws.amazonservices.com/schema/Products/2011-10-01/default.xsd'); 
    // And use the same prefix as in xml 
    $result=$sxe->xpath('//ns2:title'); 
    

    demo

    それとも、このように

    $ns = $sxe->getNamespaces(true); 
    $sxe->registerXPathNamespace('ns2',$ns['ns2']); 
    $result=$sxe->xpath('//ns2:title'); 
    

    demo

    関連する問題