我正在使用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("/*"));
答案 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。