SimpleXML Xpath()Name()返回False

时间:2014-08-11 23:25:40

标签: php xpath simplexml return-value

我正在使用PHP 5.0.5在服务器上工作,因此我无法使用getName()获取XML标记名称。 相反,我尝试使用SimpleXML在xpath()方法中使用name()函数。

我试图在根节点下方获取标签的名称,但我甚至无法获得根节点的名称,如下所示。

<?php
$xml_file = simplexml_load_file(data.xml);
if ($xml_file) {
    var_dump($xml_file->xpath("name(/*)"));
}
?>

打印&#bo;(false)&#39;。什么会导致Xpath中的name()函数返回false?

下面也正确地返回文件中所有元素的数组,因此该文件应该有效。

var_dump($xml_file->xpath("/*"));

1 个答案:

答案 0 :(得分:0)

基本上您的XPath查询错误。我会像这样使用DOM扩展:

$xml = <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend!</body>
</note>
EOF;

$doc = new DOMDocument();
$doc->loadXML($xml);
$selector = new DOMXPath($doc);

$result = $selector->query('//*');
foreach($result as $node) {
    echo $node->nodeName . PHP_EOL;
}

输出:

note
to
from
heading
body

还有一种方法可以在没有getName()函数的情况下实现它,因为标记名称是SimpleXmlElement对象中的成员名称。你需要编写一个递归解析器,(我已经通过迭代替换了递归来提高性能):

$xml = <<<EOF
<?xml version="1.0" encoding="UTF-8"?>
<note>
  <address>
    <to>Tove</to>
    <from>Jani<a>dsf</a></from>
  </address>
  <heading>Reminder</heading>
  <body>Don't forget me this weekend!</body>
</note>
EOF;

$xml = simplexml_load_string($xml);

$stack = array($xml);
do {
    $el = array_pop($stack);
    foreach($el as $key => $val) {
        if(gettype($val) !== 'string') {
            $stack []= $val;
        }
        echo $key . PHP_EOL;
    }
} while (!empty($stack));

顺便说一句,PHP 5.0.5已经很老了。难以置信你/他们还在使用它。 更新!但是,上面的代码应该适用于该版本的PHP。