0

ここで私は奇妙な振る舞いをしています。

Zend Framework 2 php (どのバージョンかは覚えていません) で実行していたコードのスニペットがあり、すべてが魅力的に機能します。

Symfony2 で新しいプロジェクトを開始したため、何らかの理由でこれを変更し、ローカル PHP (5.3.25) で実行しましたが、役に立つコードの一部を抜粋しました。

ただし、このコードはもう機能しません。

$document = new \DOMDocument();
$document->loadXML($data);
$xpath = new \DOMXPath($document);
$xpath->registerNamespace('ns',"http://somenamespace.org/FOLDER/2013"); //casual ns used for this example
$foo = $xpath->query('//ns:AvailStatusMessage');
//some elaboration here
$barXPathString = $foo->getElementsByTagName('bar')->item(0)->getNodePath();
$foobar = $xpath->query($barXPathString .'/*[@fooBarAttribute="Available"]');
//some elaboration here

結果は$foobarnullです(以前のバージョンではそうではありませんでした)。明らかに、私のコードは変更されていません。XML は重要ですが、この質問は「クエリの正確性」に関するものではなく (以前のバージョンでは機能していたので、正しいことはわかっています)、次の点についてです。

もしそうなら:$this->logger->debug('X PATH STRING: '.$barXPathString);結果は

/OTA_HotelAvailGetRS/AvailStatusMessages/AvailStatusMessage/bar

しかし、名前空間はありません。PHP のバージョン間で、この実装が変更されたのではないかと思っていました (これがイシューメーカーかどうかはわかりませんが、私は夢中になっています)。

誰もこれを知っていますか?

4

1 に答える 1

1

どのようにgetNodePath()機能するかに関係なく、XPath を手動で組み合わせて構築しようとするのは、ここでは間違ったアプローチのように見えます。DOMXPath::queryコンテキストノード引数を受け入れます。それを使用する必要があります。

$firstBar = $foo->getElementsByTagName('bar')->item(0);
$foobar = $xpath->query('*[@fooBarAttribute="Available"]', $firstBar);

また、hakre が指摘しているように、コードは少し混乱しています。DOMNodeListメソッドがないgetElementsByTagName()ため、ここで何をしようとしているのか完全にはわかりません。

$barXPathString = $foo->getElementsByTagName('bar')->item(0)->getNodePath();

それはただではありません:

$barXPathString = $foo->item(0)->getNodePath();
于 2013-06-27T05:34:23.137 に答える