2016-02-18 60 views
0

如何使用php读取下面的xml?使用php读取XML

<?xml version="1.0" encoding="UTF-8"?> 

<video> 

<youtube> youtube video url </youtube> 

</video> 

我尝试下面的代码,但似乎不工作:

$dom = new DOMDocument(); 

$dom->load('new_result.xml'); 

$results = $dom->documentElement; 

foreach($results as $result) 

{ 

foreach($result->getElementsByTagName('youtube') as $youtube) 

{ 

echo ' video url ' . $youtube->nodeValue; 

} 

} 

回答

0

无需任何幻想,只是用->getElementsByTagName()方法已加载后up:

$dom->load('new_result.xml'); // load the file 
// use ->getElementsByTagName() right away 
$youtube = $dom->getElementsByTagName('youtube'); 
if($youtube->length > 0) { // if there are youtube nodes indeed 
    foreach($youtube as $y) { // for each youtube node 
     echo $y->nodeValue; 
    } 
} 
2

试试这个:

if (file_exists('result.xml')) { 
    $xml = simplexml_load_file('result.xml'); 

    echo $xml->youtube; 
} else { 
    exit('Failed to open result.xml.'); 
} 
+0

非常感谢你,它的工作! –

+0

假设整个XML中只有一个'youtube'元素,当然。 –

+0

是的。只有一个元素 –

0

DOMDocument::documentElement是根元素节点。在你的XML中,这将是video元素节点。它不是一个节点列表,但实际的节点,所以foreach将无法​​正常工作。

只需卸下外foreach

$dom = new DOMDocument(); 
$dom->load('new_result.xml'); 
$video = $dom->documentElement; 

foreach($video->getElementsByTagName('youtube') as $youtube) { 
    echo ' video url ' . $youtube->nodeValue; 
} 

如果XML变得更加复杂,你可以使用XPath表达式:

$dom = new DOMDocument(); 
$dom->load('new_result.xml'); 
$xpath = new DOMXpath($dom); 

foreach($xpath->evaluate('/video/youtube') as $youtube) { 
    echo ' video url ' . $youtube->nodeValue; 
} 

大多数XPath表达式将返回节点列表,但他们可以返回标量值。有了这个,你可以消除第二个循环:

$dom = new DOMDocument(); 
$dom->load('new_result.xml'); 
$xpath = new DOMXpath($dom); 

echo ' video url ' . $xpath->evaluate('string(/video/youtube[1])');