Can't get node's text with XPATH from my XML using PHP

347

Hey everybody thanks for your time, I'm trying to parse a big XML file (pic bellow) and to get the text of specific nodes using XPATH expression in PHP.

Here is my 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";

}

I won't put the whole XML file here as it is way too big but here is a pic so you see the structure

xml file

Using this XPATH expression/Arborescence/Item[@type='Theme']/Titre/text() I expected to get text from my nodes but I only have an empty array with the right number of elements in it but all empty.

Anything I'm doing wrong ?

39

Answer

Solution:

The result ofSimpleXMLElement::xpath() is always an array of SimpleXMLElement objects (or false for an invalid expression). SimpleXMLElement object represent element nodes, but the extension does some magic for text nodes and attributes.

Stripping down the code from the question into an example:

$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);

Output:

array(1) { 
  [0]=> 
  object(SimpleXMLElement)#2 (1) { 
    [0]=> 
    string(7) "Loisirs"
  }
}

The result is an array with a single SimpleXMLElement that contains the text. You can usearray_map() to cast all returned objects to strings.

$xml = new SimpleXMLElement($xml);
$themes = array_map(
    function(SimpleXMLElement $element) {
        return (string)$element;
    },
    $xml->xpath("/Arborescence/Item[@type='Theme']/Titre/text()")
);

Output:

array(1) {
  [0]=> 
  string(7) "Loisirs" 
}

People are also looking for solutions to the problem: php - Lumen 5.6 Migrate Error Specified key was too long max key length is 767 bytes

Source

Didn't find the answer?

Our community is visited by hundreds of web development professionals every day. Ask your question and get a quick answer for free.

Ask a Question

Write quick answer

Do you know the answer to this question? Write a quick response to it. With your help, we will make our community stronger.

Similar questions

Find the answer in similar questions on our website.