大家好,感谢您的宝贵时间,我正在尝试解析一个大型XML文件(图波纹管),并使用PHP中的XPATH表达式获取特定节点的文本。
这是我的php:
<?php
echo "[Generation Starts !]\n";
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
if (file_exists('../source/particuliers/arborescence.xml')) {
$xml = new SimpleXMLElement(file_get_contents('../source/particuliers/arborescence.xml'));
$xml->registerXPathNamespace('dc', 'http://purl.org/dc/elements/1.1/');
$themes = $xml->xpath("/Arborescence/Item[@type='Theme']/Titre/text()");
var_dump($themes);
$JSON = json_encode($themes, JSON_UNESCAPED_UNICODE);
file_put_contents('testing.json', $JSON);
echo "[Generation Done !]\n";
} else {
echo "File wasn't found\n";
}
我不会将整个XML文件放在这里,因为它太大了,但是这里有一个图片,所以您可以看到结构
使用这个XPATH表达式/Arborescence/Item[@type='Theme']/Titre/text()
,我希望从节点中获取文本,但是我只有一个空数组,其中包含正确数量的元素,但全部为空。
我做错了什么吗?
答案 0 :(得分:0)
SimpleXMLElement::xpath()
的结果始终是SimpleXMLElement对象的数组(对于无效的表达式,为false)。 SimpleXMLElement对象表示元素节点,但是扩展对文本节点和属性确实起到了神奇作用。
将问题中的代码简化为示例:
$xml = <<<'XML'
<Arborescence>
<Item type="Theme">
<Titre>Loisirs</Titre>
</Item>
</Arborescence>
XML;
$xml = new SimpleXMLElement($xml);
$themes = $xml->xpath("/Arborescence/Item[@type='Theme']/Titre/text()");
var_dump($themes);
输出:
array(1) {
[0]=>
object(SimpleXMLElement)#2 (1) {
[0]=>
string(7) "Loisirs"
}
}
结果是一个包含单个SimpleXMLElement的数组,其中包含文本。您可以使用array_map()
将所有返回的对象转换为字符串。
$xml = new SimpleXMLElement($xml);
$themes = array_map(
function(SimpleXMLElement $element) {
return (string)$element;
},
$xml->xpath("/Arborescence/Item[@type='Theme']/Titre/text()")
);
输出:
array(1) {
[0]=>
string(7) "Loisirs"
}