通过SimpleXMLElement访问XML加载中的嵌套节点


Accessing a nested node in an XML load by SimpleXMLElement

我有一个这样结构的XML文件。

    <?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>
</COMMUNITIES>

我能够通过这个脚本获得第一级元素NAME通过HEIGHT。

<?php
function get_nodes() {
// load SimpleXML
$nodes = new SimpleXMLElement('communities.xml', null, true);
foreach($nodes as $node) // loop through 
{
        echo "<div id = '".$node['ID']."' class= 'comdiv ui-widget-content' style = 'top: ".$node->TOP."px; left: ".$node->LEFT."px; width: ".$node->WIDTH."px; height: ".$node->HEIGHT."px;'> 'n";
        echo "   <p class = 'comhdr editableText ui-widget-header'>".$node->NAME."</p>'n";
        echo "   <a href='#' onClick='"delete_div('".$node['ID']."');'">Delete</a>&nbsp;&nbsp;'n";
        echo "   <a href='#' onClick='"add_url('".$node['ID']."');'">Add URL</a>&nbsp;&nbsp;'n";
        echo "</div> 'n";
        echo "<script type='text/javascript'>'n";
        echo "  $('#".$node['ID']."').resizable();'n";
        echo "  $('#".$node['ID']."').draggable();'n";
        echo "  $('#".$node['ID']."').draggable('option', 'handle', '.comhdr');'n";
        echo "</script>'n";

        $nodeid = $node['ID'];
        $xurls = $node->URL; // WHAT IS THE WAY TO GET TO <URLS> and LOOP THOUGH ALL <URL> NODES
        $nurls = sizeof($xurls);
}
        echo "<script type='text/javascript'>'n";
        echo "  $('.editableText').editableText();'n";
        echo "</script>'n";
   return;
}
echo get_nodes();
?>

如何获得节点中包含的节点数组?获得该数组后,必须检索每个URL的NAME和URLC。

谢谢。

稍微长一点,但对我来说还行

$nodes = new SimpleXMLElement('communities.xml', null, true);
foreach($nodes->COMMUNITY->URLS->URL as $url) {
 echo $url['ID'];
 echo $url->NAME;
 echo $url->URL;
}

谢谢大家的建议。它们都给了我比以前更多的关于访问嵌套节点的信息。我把杰米的建议修改了一下。对于每个社区节点,我都使用这个循环访问url。

    foreach($node->URLS->URL as $url)
    { 
       // Print HTML elements with the URL information
    }

这是完整的工作脚本。

<?php
function get_nodes() {
// load SimpleXML
$nodes = new SimpleXMLElement('communities.xml', null, true);
foreach($nodes as $node) // loop through 
{
        echo "<div id = '".$node['ID']."' class= 'comdiv ui-widget-content' style = 'top: ".$node->TOP."px; left: ".$node->LEFT."px; 
width: ".$node->WIDTH."px; height: ".$node->HEIGHT."px;'> 'n";
        echo "   <p class = 'comhdr editableText ui-widget-header'>".$node->NAME."</p>'n";
        echo "   <a href='#' onClick='"delete_div('".$node['ID']."');'">Delete</a>&nbsp;&nbsp;'n";
        echo "   <a href='#' onClick='"add_url('".$node['ID']."');'">Add URL</a>&nbsp;&nbsp;'n";
        echo "</div> 'n";
        echo "<script type='text/javascript'>'n";
        echo "  $('#".$node['ID']."').resizable();'n";
        echo "  $('#".$node['ID']."').draggable();'n";
        echo "  $('#".$node['ID']."').draggable('option', 'handle', '.comhdr');'n";
        echo "</script>'n";
        foreach($node->URLS->URL as $url)
        { 
           echo "<script type='text/javascript'> alert('Node: ".$node['ID']." has URLS:".$url['ID']." ".$url->NAME." ".$url->URL." '); 
</script>";
        }

}
        echo "<script type='text/javascript'>'n";
        echo "  $('.editableText').editableText();'n";
        echo "</script>'n";
   return;
}
echo get_nodes();
?>

您可以尝试使用

$urls = $node->xpath('URLS/URL');
foreach($urls as $url) {}

但是你的代码似乎有错误。代替$node->URL*S*;使用$node->URL;试着替换。

我不太确定你到底在找什么,但这可能是有用的:

$node->children();返回节点的子节点,您可以轻松地遍历:

foreach ($node->URLS->children() as $child)
{
    print $child->URL;
}

HTH