首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DOMNode::getNodePath:它是否考虑了命名空间?

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

Stack Overflow用户
提问于 2013-06-26 23:18:50
回答 1查看 195关注 0票数 0

我有个奇怪的行为。

我有一段在zend framework 2php下运行的代码(不记得是什么版本了),一切运行起来都很棒。

由于某些原因,当我在Symfony2上开始一个新项目时,我对此进行了更改,并在本地PHP (5.3.25)下运行它,但我采用了一些可能对我有用的代码片段。

然而,现在这段代码不再工作了:

代码语言:javascript
复制
$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);结果是

代码语言:javascript
复制
/OTA_HotelAvailGetRS/AvailStatusMessages/AvailStatusMessage/bar

但是没有命名空间。所以我想知道在PHP版本之间,这个实现是不是改变了(不知道这是不是issue maker,但我快疯了)

有人知道这一点吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-06-27 13:34:23

不管getNodePath()是如何工作的,试图通过手动拼凑来构建XPath在这里看起来是错误的方法。DOMXPath::query接受上下文节点参数,您应该使用该参数:

代码语言:javascript
复制
$firstBar = $foo->getElementsByTagName('bar')->item(0);
$foobar = $xpath->query('*[@fooBarAttribute="Available"]', $firstBar);

同样,正如hakre所指出的,你的代码有点混乱。DOMNodeList没有getElementsByTagName()方法,所以我不能完全确定您在这里要做什么:

代码语言:javascript
复制
$barXPathString = $foo->getElementsByTagName('bar')->item(0)->getNodePath();

这不就是:

代码语言:javascript
复制
$barXPathString = $foo->item(0)->getNodePath();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17324084

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档