我在这里有一个奇怪的行为。
我有一段代码,我曾经在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
为null(在以前的版本中不是)。显然我的代码没有更改。尽管XML很重要,但这个问题不是关于"查询正确性"(我知道这是正确的,因为它在以前的版本中起作用),而是关于以下内容:
如果我这样做:$this->logger->debug('X PATH STRING: '.$barXPathString);
结果是
/OTA_HotelAvailGetRS/AvailStatusMessages/AvailStatusMessage/bar
但是没有命名空间。所以我想知道在PHP版本之间,这个实现是否发生了变化(不知道这是否是问题制造者,但我正在疯狂地运行)
有人知道吗?
不管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();