2017-10-07 117 views
0

我只需要回顯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 

回答

2

如果你改變你的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

我發現它更容易編寫簡單的代碼:)如果它解決了你的問題 - 你可以標記爲答案 - 通過問題挽救我拖網後來。 –