DOMNode :: getNodePath:它是否考虑了命名空间?

时间:2013-06-26 15:18:50

标签: php xml xpath

我在这里有一种奇怪的行为。

我有一段代码,我曾经在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

结果是$foobar为空(以前的版本不是)。显然我的代码没有改变。虽然XML很重要,但这个问题不是关于“查询正确性”(我知道这是正确的,因为它适用于以前的版本)但是关于以下内容:

如果我这样做:$this->logger->debug('X PATH STRING: '.$barXPathString);结果是

/OTA_HotelAvailGetRS/AvailStatusMessages/AvailStatusMessage/bar

但没有命名空间。所以我想知道是否在PHP版本之间,这个实现被改变了(不知道这是问题制造者,但我疯了)

有人意识到这一点吗?

1 个答案:

答案 0 :(得分: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();