XML getting nested nodes in PHP
In this php script which reads an XML file, the inner loop for accessing the nested nodes doesn't return any data.
PHP script
<?php
// load SimpleXML
$nodes = new SimpleXMLElement('communities.xml', null, true);
echo <<<EOF
<table>
<tr>
<th>ID</th>
<th>Name</th>
<th>Top</th>
<th>Left</th>
<th>Width</th>
<th>Height</th>
<th>Urls</th>
</tr>
EOF;
foreach($nodes as $node) // loop through
{
echo "<tr>";
echo " <td>".$node['ID']."</td>";
echo " <td>".$node->NAME."</td>";
echo " <td>".$node->TOP."</td>";
echo " <td>".$node->LEFT."</td>";
echo " <td>".$node->WIDTH."</td>";
echo " <td>".$node->HEIGHT."</td>";
echo " <td>";
$urls = $node->URLS;
/* $urls = $xml->xpath('/COMMUNITIES/COMMUNITY/URLS/URL'); */
foreach($urls as $url)
{
echo ' '.$url->NAME;
}
echo ' </td>';
echo '</tr>';
}
echo '</table>';
?>
XML file
<?xml version="1.0" encoding="ISO-8859-1" ?>
<COMMUNITIES>
<COMMUNITY ID="c001">
<NAME>Town Services</NAME>
<TOP>50</TOP>
<LEFT>50</LEFT>
<WIDTH>200</WIDTH>
<HEIGHT>300</HEIGHT>
<URLS>
<URL ID="U001">
<NAME>Google.com</NAME>
<URL>http://www.google.com</URL>
</URL>
<URL ID="U002">
<NAME>Bing.com</NAME>
<URL>http://www.bing.com</URL>
</URL>
<URL ID="U003">
<NAME>Yahoo.com</NAME>
<URL>http://www.yahoo.com</URL>
</URL>
<URL ID="U004">
<NAME>Aol.com</NAME>
<URL>http://www.aol.com</URL>
</URL>
</URLS>
</COMMUNITY>
<COMMUNITY ID="c002">
<NAME>Local Stores</NAME>
<TOP>50</TOP>
<LEFT>260</LEFT>
<WIDTH>200</WIDTH>
<HEIGHT>150</HEIGHT>
<URLS>
<URL ID="U001">
<NAME>Walgreens</NAME>
<URL>http://www.walgreens.com</URL>
</URL>
<URL ID="U002">
<NAME>Bing.com</NAME>
<URL>http://www.bing.com&开发者_C百科lt;/URL>
</URL>
<URL ID="U003">
<NAME>Yahoo.com</NAME>
<URL>http://www.yahoo.com</URL>
</URL>
</URLS>
</COMMUNITY>
<COMMUNITY ID="c003">
<NAME>Attractions</NAME>
<TOP>50</TOP>
<LEFT>470</LEFT>
<WIDTH>200</WIDTH>
<HEIGHT>300</HEIGHT>
<URLS>
<URL ID="U001">
<NAME>Museum</NAME>
<URL>http://www.mfa.org</URL>
</URL>
<URL ID="U002">
<NAME>Park</NAME>
<URL>http://www.bing.com</URL>
</URL>
</URLS>
</COMMUNITY>
<COMMUNITY ID="c004">
<NAME>Online Stores</NAME>
<TOP>370</TOP>
<LEFT>50</LEFT>
<WIDTH>200</WIDTH>
<HEIGHT>150</HEIGHT>
<URLS>
<URL ID="U001">
<NAME>Amazon.com</NAME>
<URL>http://www.amazon.com</URL>
</URL>
<URL ID="U002">
<NAME>Target.com</NAME>
<URL>http://www.target.com</URL>
</URL>
</URLS>
</COMMUNITY>
<COMMUNITY ID="c005">
<NAME>Online Forums</NAME>
<TOP>370</TOP>
<LEFT>300</LEFT>
<WIDTH>200</WIDTH>
<HEIGHT>200</HEIGHT>
<URLS>
<URL ID="U001">
<NAME>Technet</NAME>
<URL>http://www.Microsoft.com</URL>
</URL>
<URL ID="U002">
<NAME>MSDN</NAME>
<URL>http://www.Microsoft.com</URL>
</URL>
</URLS>
</COMMUNITY>
<COMMUNITY ID="c006">
<NAME>Travel</NAME>
<TOP>370</TOP>
<LEFT>480</LEFT>
<WIDTH>200</WIDTH>
<HEIGHT>200</HEIGHT>
<URLS>
<URL ID="U001">
<NAME>Southwest</NAME>
<URL>http://www.mfa.org</URL>
</URL>
<URL ID="U002">
<NAME>Northwest</NAME>
<URL>http://www.bing.com</URL>
</URL>
</URLS>
</COMMUNITY>
</COMMUNITIES>
I also tried accessing the inner node with xpath and that returned errors.
$urls = $xml->xpath('/COMMUNITIES/COMMUNITY/URLS/URL');
What is the right way of accessing the inner nodes? Thanks.
You just need to change it to:
foreach($urls->URL as $url)
{
echo ' '.$url->NAME;
}
精彩评论