Не могу получить текст узла с XPATH из моего XML с использованием PHP - PullRequest
0 голосов
/ 04 июля 2018

Привет всем, спасибо за ваше время, я пытаюсь разобрать большой XML-файл (рис. Ниже) и получить текст конкретных узлов, используя выражение XPATH в PHP.

Вот мой 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 голосов
/ 02 августа 2018

Результатом 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" 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...