无法使用PHP从我的XML中获得带有XPATH的节点文本

时间:2018-07-04 09:01:08

标签: php xml xpath

大家好,感谢您的宝贵时间,我正在尝试解析一个大型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文件放在这里,因为它太大了,但是这里有一个图片,所以您可以看到结构

xml file

使用这个XPATH表达式/Arborescence/Item[@type='Theme']/Titre/text(),我希望从节点中获取文本,但是我只有一个空数组,其中包含正确数量的元素,但全部为空。

我做错了什么吗?

1 个答案:

答案 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" 
}