2010-04-17 3 views
2

Я использую XPath в PHP 5 для анализа XML-документа. У меня есть проблема пишет foreach правильно отобразить следующий массив:Напишите цикл foreach для массива SimpleXMLElements

XML документ образец

значение 1 значение 2

  $xmlfile = 'link_to_file.xml';      
      $xmlRaw = file_get_contents($xmlfile);  
      $xml = new SimpleXMLElement($xmlRaw); 
      $install_files = $xml->xpath('//files'); 
      foreach($install_files as $row) 
      { 
       echo $row['file']; 
      } 

// var_dump для $ строки дает следующее:

   array(1) { 
        [0]=> 
        object(SimpleXMLElement)#21 (2) { 
        ["file"]=> 
        string(12) "value 1" 
        ["folder"]=> 
        string(8) "value 2" 
        } 
       } 

В идеале я хотел бы получить значение с помощью $row['file'] или $row['folder']. Спасибо за любую помощь.

+1

@mjames, связано это домашнее задание? – Kiril

+0

Это фактически для сценария, который я создаю. – mjames

+0

круто ... просто проверяя, заголовок казался немного «домашним заданием-иш». – Kiril

ответ

2

Элементы в массиве являются SimpleXMLElement объекты. Вы можете получить доступ к их properties с синтаксисом $object->property. Так что попробуйте сделать следующее:

foreach ($array as $row) { 
    echo $row->folder . $row->file; 
} 
+0

Спасибо, я не понимал, что должен был использовать его в виде объекта -> файл вместо ['file]. Отлично работает сейчас :) – mjames

0

Если я правильно понимаю ваш пример правильно,

foreach ($array as $row) 
{ 
    // do something with $row['file'] or $row['folder'] 
} 
0

Если вы хотите обработать только один элемент, вам не обязательно нужен цикл, но это тоже не повредит.
В соответствии с вашими результатами file и folder являются дочерними элементами элемента, возвращаемого для вашего запроса xpath. Вы можете получить к ним доступ через $parentElement->childElement. Если бы они были атрибуты вы бы использовать $element['attributeName']

$foo = new SimpleXMLElement(getData()); 

foreach($foo->xpath('row[@id="r2"]') as $row) { 
    echo $row->file, " | ", $row->folder, "\n"; 
} 
echo "-----\n"; 

// same thing if you have more than one element in your result set 
foreach($foo->xpath('row[@id="r2" or @id="r3"]') as $row) { 
    echo $row->file, " | ", $row->folder, "\n"; 
} 

function getData() { 
    return '<foo> 
    <row id="r1"> 
     <file>value 1.1</file> 
     <folder>value 1.2</folder> 
    </row> 
    <row id="r2"> 
     <file>value 2.1</file> 
     <folder>value 2.2</folder> 
    </row> 
    <row id="r3"> 
     <file>value 3.1</file> 
     <folder>value 3.2</folder> 
    </row> 
    </foo>'; 
} 

отпечатки

value 2.1 | value 2.2 
----- 
value 2.1 | value 2.2 
value 3.1 | value 3.2 
+0

Это тоже было очень полезно, спасибо :) – mjames

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