Доступ к вложенному узлу в загрузке XML с помощью SimpleXMLElement - PullRequest
0 голосов
/ 23 августа 2011

У меня есть 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();
?>

Как получить массив узлов, содержащихся в узле? Получив этот массив, я должен получить NAME и URLC для каждого URL.

Спасибо.

Ответы [ 4 ]

2 голосов
/ 24 августа 2011

Немного дольше, но у меня работает

$nodes = new SimpleXMLElement('communities.xml', null, true);

foreach($nodes->COMMUNITY->URLS->URL as $url) {
 echo $url['ID'];
 echo $url->NAME;
 echo $url->URL;
}
1 голос
/ 24 августа 2011

Спасибо за все предложения.Все они дали мне больше информации, чем я имел раньше о доступе к вложенным узлам.Я пошел с измененной версией предложения Джейми.С каждым узлом сообщества я обращался к 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();

?>
0 голосов
/ 24 августа 2011

Вы можете попробовать использовать

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

Но, похоже, в вашем коде есть ошибка.Вместо $ node-> URL * S *;вы используете $ node-> URL ;.Попробуйте заменить.

0 голосов
/ 24 августа 2011

Я не совсем уверен, что именно вы ищете, но это может быть полезно:

$node->children(); возвращает дочерние элементы узла, и вы можете легко выполнить цикл:

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

НТН

...