PHP и XML. Цикл XML-файла с PHP - PullRequest
3 голосов
/ 27 июля 2011

Я сейчас по колено в чистилище foreach, сейчас пытаюсь найти способ обойти этот XML-файл (фактический XML-текст ниже) с помощью PHP (следуя содержимому XML-файла). Я пытаюсь сделать следующее:

  1. Получить все имена элементов папки
  2. Если элемент папки имеет значение «да» в качестве атрибута подпапки, переместите уровень вниз и выберите имя этого элемента папки
  3. Если нетперейти к следующему элементу папки

gallerylist.xml:

<?xml version="1.0" encoding="ISO-8859-1"?>
<gallerylisting exists="yes">
<folder subfolder="yes">
Events
   <folder subfolder="yes">
   Beach_Clean_2010
        <folder subfolder="no">
        Onna_Village
        </folder>
            <folder subfolder="no">
            Sunabe_Sea_Wall
        </folder>
        </folder>
  </folder>
  <folder subfolder="no">
  Food_And_Drink
  </folder>
  <folder subfolder="no">
  Inside
  </folder>
  <folder subfolder="no">
  Location
  </folder>
  <folder subfolder="no">
  NightLife
  </folder>
</gallerylisting>

gallerylisting.php

<?php
$xmlref = simplexml_load_file("gallerylisting.xml");
foreach($xmlref->children() as $child) {
    foreach($child->attributes() as $attr => $attrVal) {
        print $child;
        if($attrVal == "yes") {
            foreach($child->children() as $child) {
                echo $child;
                foreach($child->attributes() as $attr => $attrVal) {
                    if($attrVal == "yes") {
                        foreach($child->children() as $child) {
                            echo $child;
                        }
                    }                   
                }
            }
        }
    }
}

Я ... считаю ...5 foreach зацикливается на этом PHP-скрипте, и он мне совсем не нравится, плюс, если бы в моих папках была другая подпапка, мне пришлось бы добавить эту же

$if(attrVal=="yes")...etc.

снова и хорошо ... нет!Есть ли вообще что-нибудь, что я могу избежать этого.Я новичок в PHP, и особенно в PHP и XML.

Спасибо за любую помощь.

Ответы [ 3 ]

5 голосов
/ 27 июля 2011

Рекурсия может быть полезна для вас здесь.

<?php

function display_entities( $xml )
{
    foreach($xml->children() as $child) {
        foreach($child->attributes() as $attr => $attrVal) {
            print $child;
            if($attrVal == "yes") {
              display_entities( $child->children() );
            }
        }
    }
}

$xmlref = simplexml_load_file("gallerylisting.xml");

display_entities($xmlref->children());
2 голосов
/ 27 июля 2011

Использовать XPath:

Если подпапка = no ненадежна в листьях (т. Е. Не всегда может быть установлено no):

foreach($xmlref->xpath('//folder[not(@subfolder) or @subfolder!="yes"]') as $node){

Если это:

foreach($xmlref->xpath('//folder[@subfolder="no"]') as $node){

Или даже если вы хотите проверить папки без дочерних папок, игнорируя атрибут:

foreach($xmlref->xpath('//folder[not(folder)]') as $node){
0 голосов
/ 27 июля 2011

Вы можете попробовать использовать xpath вместо метода вложенных циклов ..

Выполнить запрос

gallerylisting//folder[@subfolder="yes"]/text() 

на вашем XML-документе, указанном выше, используя этот xpath-тестер дает результаты Events и Beach_Clean_2010, что, как я думаю, вам нужно.Запрос найдет все элементы папки в списке галерей корневого узла, и если они имеют атрибут подпапки, равный «да», будет возвращен текст в узле.

Итак, в PHP у нас есть

<?php
    $xmldoc = new DOMDocument();
    $xmldoc->load('gallerylisting.xml');

    $xpathvar = new Domxpath($xmldoc);

    $queryResult = $xpathvar->query('gallerylisting//folder[@subfolder="yes"]/text()');
    foreach($queryResult as $result){
            echo $result->textContent;
    }
?>

Я не парень по PHP, поэтому я доверяю коду в , этот вопрос StackOverflow работает.Следует помнить, что использование // имени в xpath означает поиск всех узлов, произошедших от текущей позиции, которые соответствуют имени.Это может быть очень медленно на больших документах.

Кажется, есть несколько способов обработки xpath с помощью PHP.Пример из этой страницы выполняет запрос следующим образом:

   $result = $xml->xpath("gallerylisting//folder[@subfolder="yes"]/text()");

   print_r($result);
?> 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...