2

次のXMLについて考えてみます。

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/">
   <s:Body>
      <myResponse xmlns="https://example.com/foo">
         <myResult xmlns:a="https://example.com/bar" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
            <a:accountNumber>AAA</a:accountNumber>
            <a:accountName>BBB</a:accountName>
            <a:accountType>CCC</a:accountType>
         </myResult>
      </myResponse>
   </s:Body>
</s:Envelope>

myResultとその下のすべての要素を選択しようとしています。

私が得た最も近いものは次のとおりです。

//*[local-name()='myResult']//a:*

これで要素の値がわかりますが、どの値がどの要素に属しているのかわかりません。

私はこれをPHPで行っています。これが(大まかに)私が使用しているコードです。

<?php
$xmlObject = new SimpleXMLElement($result);
$namespaces = $xmlObject->getNamespaces(true);
foreach($namespaces as $key => $value) {
   if($key == '') {
      $key = 'ns';
   }
   $xmlObject->registerXPathNamespace($key, $value);
}
$element = $xmlObject->xpath("//myResult");
?>

XPathとXML名前空間(ああ、私がどのように検索したか)についてたくさんの質問があったことは知っていますが、私の特定のケースに一致するものは見つかりませんでした。私がやりたいことは可能ですか?

4

2 に答える 2

2

あなたの//*[local-name()='myResult']//a:*作品はうまくいきます。getNameタグの名前を取得するには、ループして使用するだけです。

$element = $xmlObject->xpath("//*[local-name()='myResult']//a:*");
foreach($element as $e){
    echo $e->getName() . ': '. (string)$e;
}

デモ: http://codepad.org/BAefIKZ4

編集:名前空間を登録しているので、それらを使用しないのはなぜですか?

$element = $xmlObject->xpath("//ns:myResult//a:*");

デモ: http://codepad.org/9MKq5oDt

于 2012-07-23T15:53:17.657 に答える
1

デフォルトの名前空間を「ns」に定義する場合は、次を使用します。

$element = $xmlObject->xpath("//ns:myResult");
于 2012-07-23T16:06:53.893 に答える