2014-02-18 2 views
0

Это мой XML-структура:Отобразить все узлы в XML

<?xml version="1.0"?> 
    <Module_Files> 
     <Category name="test1"> 
      <file lang="fr"> 
       <title>Menu</title> 
       <description>Menu list</description> 
       <path>menu.pdf</path> 
      </file> 
     </Category> 
     <Category name="test2"> 
      <file lang="fr"> 
       <title>Spa</title> 
       <description>Services offered in our Spa</description> 
       <path>spa.pdf</path> 
      </file> 
      <file lang="en"> 
       <title>Gym</title> 
       <description>rate</description> 
       <path>gym.pdf</path> 
      </file> 

     </Category> 
    </Module_Files> 

Я хочу, чтобы для каждой категории <Category> все файлы <file>. но мне удалось получить только первый файл. Я хочу, чтобы отобразить, как это (я беру test2 Категорию для примера):

названия: Сп, описание: Услуги, предлагаемые в нашем Spa, пути: spa.pdf

названия: Центр, описание: скорость , путь: gym.pdf

Это мой код:

$categoryConfig = $xmlFile->xpath("//Category[@name='" . $categorySelected . "']/config"); 

foreach ($categoryConfig as $key => $value) 
{ 
    $rightPanel .= $key . ":" . $value; 
} 

И это то, что я получаю с этим кодом:

0: 1:

var_dump($categoryConfig) =

array(2) { 
    [0]=> object(SimpleXMLElement)#26 (4) 
     { ["@attributes"]=> array(1) { ["lang"]=> string(2) "fr" } 
     ["title"]=> string(3) "Spa" ["description"]=> string(35) "Services offered in our Spa" ["path"]=> string(7) "spa.pdf" } 

    [1]=> object(SimpleXMLElement)#27 (4) 
     { ["@attributes"]=> array(1) { ["lang"]=> string(2) "en" } 
     ["title"]=> string(14) "Gym" ["description"]=> string(29) "Rate" ["path"]=> string(18) "gym.pdf" } 
    } 
+0

Вы выбираете 'config' дочерний элемент' category' с конкретным 'name' атрибута. Он не соответствует XML в вашем примере (без элементов 'config'). Для вывода каждого 'файла' в каждой' категории' вам понадобится две петли, а не одна. Внешний для категорий и внутренний для файлов каждой категории. Если вы хотите вывести файл, независимый от категорий, которые вы могли бы выбрать, и переименовать их напрямую. – ThW

ответ

0

Вложенные циклы с children() -метода будет делать это:

$xml = simplexml_load_string($x); // assume XML in $x 

$catname = "test2"; 
// select all <file> under <category name='test2'> 
$files = $xml->xpath("/*/Category[@name='$catname']/file"); 

foreach ($files as $file) { 
    foreach ($file->children() as $key => $value) 
     echo $key . ': ' . $value . PHP_EOL; 
    echo PHP_EOL; 
}   

Как комментарий THW указывается, ваша xpath выражение не совпадает, так как в xml нет <config>. Я скорректировал его до <file>.

видеть, что это работает: https://eval.in/102766

Смежные вопросы