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

Regardless of how getNodePath() works, trying to build up the XPath by manually cobbling it together looks like the wrong approach here. DOMXPath::query accepts a context node argument, and you should use that:

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

Also as hakre points out, your code is a bit confusing. DOMNodeList doesn't have a getElementsByTagName() method, so I'm not entirely sure what you're trying to do here:

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

Wouldn't it just be:

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