使用XPath解析XML在PHP中

问题描述:

我只需要回显ID和标题,我已经使用xpath来获取详细信息...我需要在单独的行中回显ID和标题...使用XPath解析XML在PHP中

<?php 
$xml = <<< XML 
<data> 
    <metadata> 
     <total_elements>183</total_elements> 
     <elements_per_page>100</elements_per_page> 
     <total_pages>2</total_pages> 
    </metadata> 
    <spl> 
     <id>ID1</id> 
     <version>2</version> 
     <title>Title 1</title> 
     <published_date>Oct 06, 2017</published_date> 
    </spl> 
    <spl> 
     <id>ID2</id> 
     <version>2</version> 
     <title>Title 2</title> 
     <published_date>Oct 05, 2017</published_date> 
    </spl> 
    <spl> 
     <id>ID3</id> 
     <version>2</version> 
     <title>Title 3</title> 
     <published_date>Oct 04, 2017</published_date> 
    </spl> 
</data> 
XML; 

$errorSetting = libxml_use_internal_errors(TRUE); 
$feed = new DOMDocument(); 
$feed->loadXML($xml); 
libxml_clear_errors(); 
libxml_use_internal_errors($errorSetting); 

$xpath = new DOMXPath($feed); 

foreach ($xpath->query('//spl') as $spl) { 
    foreach ($spl->childNodes as $child) 
    { 
     if (($child->nodeValue) !== '') 
     { 
      echo \htmlspecialchars($child->nodeValue); 

     } 
    } 
} 
?> 

这给出输出:

ID1 
2 
Title 1 
Oct 06, 2017 

ID2 
2 
Title 2 
Oct 05, 2017 

ID3 
2 
Title 3 
Oct 04, 2017 

备选地我尝试:

foreach ($xpath->query('//id') as $id) 
    { 
     if (($id->nodeValue) !== '') { 
     echo \htmlspecialchars($id->nodeValue);     
     } 
    foreach ($xpath->query('//title') as $title) { 
     echo \htmlspecialchars($title->nodeValue); 
     } 

    } 

但它给输出:

ID1 Title 1 Title 2 Title 3 
ID2 Title 1 Title 2 Title 3 
ID3 Title 1 Title 2 Title 3 

我需要输出为:

ID1 Title 1 
ID2 Title 2 
ID3 Title 3 

如果你改变你的foreach循环

foreach ($xpath->query('//spl') as $spl) { 
    echo $xpath->evaluate("string(descendant::id/text())", $spl); 
    echo $xpath->evaluate("string(descendant::title/text())", $spl); 
    echo PHP_EOL; 
} 

这遍历所有的spl元素,然后内部的XPath,获取id和title(后代确保它只是封闭元素中的项目)。使用evaluate()意味着不是获取节点,在这种情况下,返回的值是一个字符串。同样在evaluate()中,我使用$spl作为查询的起点。

+0

谢谢,为最简单的代码...一些脂肪酶使代码太复杂.. –

+0

我发现它更容易编写简单的代码:)如果它解决了你的问题 - 你可以标记为答案 - 通过问题挽救我拖网后来。 –