6

重複の可能性:
xPath は * しか検出しません

xml を使用して .COLLADA ファイルを解析しようとしています。xpath()問題は、ルート タグに xmlns 属性がある場合、要素へのアクセスに使用できないように見えることです。

たとえば、これは機能します:

$string = <<<TEST
<?xml version="1.0" encoding="utf-8"?>
<COLLADA version="1.4.1">
  <library_materials>
    <material id="Material" name="Material">
      <instance_effect url="#Material-effect"/>
    </material>
    <material id="Material2" name="Material">
      <instance_effect url="#Material-effect2"/>
    </material>
  </library_materials>
</COLLADA>
TEST;
$lol = new SimpleXMLElement($string);
print_r($lol->library_materials->xpath("material[@id='Material2']"));

しかし、これはしません:

$string = <<<TEST
<?xml version="1.0" encoding="utf-8"?>
<COLLADA xmlns="http://www.collada.org/2005/11/COLLADASchema" version="1.4.1">
  <library_materials>
    <material id="Material" name="Material">
      <instance_effect url="#Material-effect"/>
    </material>
    <material id="Material2" name="Material">
      <instance_effect url="#Material-effect2"/>
    </material>
  </library_materials>
</COLLADA>
TEST;
$lol = new SimpleXMLElement($string);
print_r($lol->library_materials->xpath("material[@id='Material2']"));

xmlns によって突然 xml ツリーが使用できなくなるのはなぜですか? 名前空間を定義しただけだと思ったので、他の名前空間の他の同一のタグと区別できます。私は何が欠けていますか?

4

2 に答える 2

2

名前空間を登録する必要があります。

$lol = new SimpleXMLElement($string);
$lol->registerXPathNamespace('cada', 'http://www.collada.org/2005/11/COLLADASchema');
print_r($lol->xpath("child::cada:library_materials//*[@id='Material2']"));
于 2011-03-13T00:04:09.983 に答える
1

名前空間の宣言は、名前が名前空間にあることを意味しますが、XPath は名前空間の名前を探していません。名前空間付きの要素を検索する方法は、XPath 1.0 または 2.0 のどちらを使用しているかによって異なります。XPath で名前空間プレフィックスを使用して名前空間付きの名前を表す場合、プレフィックスを宣言する方法は、XPath プロセッサへの API によって異なります。使用しています。

于 2011-03-13T00:05:48.703 に答える