【问题标题】:Accessing a nested node in an XML load by SimpleXMLElement通过 SimpleXMLElement 访问 XML 加载中的嵌套节点
【发布时间】:2011-08-23 19:55:55
【问题描述】:

我有一个具有这种结构的 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>

我可以使用这个脚本通过 HEIGHT 到达一级元素 NAME。

<?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。

谢谢。

【问题讨论】:

    标签: php xml simplexml


    【解决方案1】:

    有点长,但对我有用

    $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 ($nodes... ) {} loop 中,我检索了像foreach($node-&gt;URLS-&gt;URL as $url) {} 这样的URL。这很好用。感谢您为我指明正确的方向。
    【解决方案2】:

    感谢所有建议。他们都给了我比以前更多的关于访问嵌套节点的信息。我接受了 Jamie 建议的修改版本。对于每个社区节点,我都使用此循环访问了 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();
    
    ?>
    

    【讨论】:

      【解决方案3】:

      你可以尝试使用

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

      但您的代码似乎有错误。而不是 $node->URL*S*;你使用 $node->URL;。尝试更换。

      【讨论】:

      • 我收到一个错误:Fatal error: Call to undefined method DOMElement::xpath() in C:\inetpub\wwwroot\community\get_nodes.php on line 67
      • 您的代码似乎有错误。而不是 $node->URLS;你使用 $node->URL;。尝试替换。
      【解决方案4】:

      我不太确定您到底在寻找什么,但这可能很有用:

      $node-&gt;children(); 返回节点的子节点,您可以轻松循环:

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

      HTH

      【讨论】:

      • 我收到 children() 错误:` 致命错误:在 C:\inetpub\wwwroot\community\get_nodes.php 第 76 行调用未定义的方法 DOMElement::children()'跨度>
      • 用 $node->URLS->children() 试试。我的错!
      猜你喜欢
      • 2015-11-11
      • 1970-01-01
      • 2011-04-12
      • 1970-01-01
      • 2016-02-13
      • 2013-11-05
      • 1970-01-01
      • 2016-03-19
      • 2015-01-06
      相关资源
      最近更新 更多