doushuhuai7247 2018-07-04 09:01
浏览 76

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

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 !]
";
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 !]
";

} else {

  echo "File wasn't found
";

}

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 ?

  • 写回答

1条回答

  • dongyou6847 2018-08-02 08:38
    关注

    The result of SimpleXMLElement::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 use array_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" 
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥15 vc6.0中想运行代码的时候总是提示无法打开文件是怎么回事
  • ¥25 关于##爬虫##的问题,如何解决?:
  • ¥15 ZABBIX6.0L连接数据库报错,如何解决?(操作系统-centos)
  • ¥15 找一位技术过硬的游戏pj程序员
  • ¥15 matlab生成电测深三层曲线模型代码
  • ¥50 随机森林与房贷信用风险模型
  • ¥50 buildozer打包kivy app失败
  • ¥30 在vs2022里运行python代码
  • ¥15 不同尺寸货物如何寻找合适的包装箱型谱
  • ¥15 求解 yolo算法问题