2016-12-16 6 views
1
<info> 
    <form tableid="1"> 
     <town_id> 
      <option value="5102">Moscow</option> 
      <option value="2587">London</option> 
      <option value="717">Madrid</option> 
      <option value="2513">Paris</option> 
      <option value="5071">Berlin</option> 
     </town_id> 
    </form> 
</info> 

У меня есть такой xml и вы можете проанализировать его через simplexml_load_string. Функция возвращает такой объект:Анализ XML с помощью simplexml_load_string в PHP

SimpleXMLElement Object 
(
    [form] => SimpleXMLElement Object 
     (
      [@attributes] => Array 
       (
        [tableid] => 1 
       ) 

      [town_id] => SimpleXMLElement Object 
       (
        [option] => Array 
         (
          [0] => Moscow 
          [1] => London 
          [2] => Madrid 
          [3] => Paris 
          [4] => Berlin 
         ) 

       ) 

     ) 

) 

У меня нет второго значения атрибутов из вариантов города. Как я могу их получить? мой код:

/** @var SimpleXMLElement $xml */ 
$xml = simplexml_load_string($data); 
if (! is_object($xml)) return FALSE; 

print_r($xml); 
foreach($xml as $record){ 
    $attr = $record->attributes(); 
    $table_id = (int)$attr['tableid']; 
    foreach($record as $key => $value){ 
     //$table_data[$table_id][$key][] = $value['option']; 
     print_r($value->attributes()); 
     print_r($value['option']->attributes()); 
    } 
} 

$value является SimpleXMLElement объект, но $value->attributes() и $value['option]->attributes() возвращение пустой массив.

ответ

1

Вы можете просто итерацию по SimpleXMLElement объектов путем доступа детей с -> оператора:

$xml = <<<'XML' 
<info> 
    <form tableid="1"> 
     <town_id> 
      <option value="5102">Moscow</option> 
      <option value="2587">London</option> 
      <option value="717">Madrid</option> 
      <option value="2513">Paris</option> 
      <option value="5071">Berlin</option> 
     </town_id> 
     <town_id> 
      <option value="9343">XTown</option> 
     </town_id> 
    </form> 
</info> 
XML; 

$items = simplexml_load_string($xml); 

foreach ($items as $form) { 
    foreach ($form->town_id as $town) { 
     foreach ($town->option as $option) { 
      $attr = $option->attributes(); 
      printf("#%d - %s\n", $attr['value'], $option); 
     } 
    } 
} 

Выходной

#5102 - Moscow 
#2587 - London 
#717 - Madrid 
#2513 - Paris 
#5071 - Berlin 
#9343 - XTown 

XPath

В качестве альтернативы, используйте xpath метод:

$options = $items->xpath('form/town_id/option'); 
foreach ($options as $option) { 
    $attr = $option->attributes(); 
    printf("#%d - %s\n", $attr['value'], $option); 
} 

В этом примере я использовал выражение XPath относительно $items (в частности, корневой элемент). Отрегулируйте XPath в соответствии с вашими потребностями. Например, вы можете получить все параметры в документе с помощью //option. Или вы даже хотите перебрать все элементы под form, имеющих option детей:

$containers = $items->xpath('form/*[option]'); 
foreach ($containers as $c) { 
    switch ($c->getName()) { 
    case 'town_id': $label = 'Towns';  break; 
    case 'country_id': $label = 'Countries'; break; 
    default: 
     // Skipping unknown element name 
     continue; 
    } 

    printf("\n%s\n======\n", $label); 
    foreach ($c->option as $option) { 
    $attr = $option->attributes(); 
    printf("#%d - %s\n", $attr['value'], $option); 
    } 
} 

Пример вывода

Towns 
====== 
#5102 - Moscow 
#2587 - London 
#717 - Madrid 
#2513 - Paris 
#5071 - Berlin 

Towns 
====== 
#9343 - XTown 

Countries 
====== 
#3456 - Russia 
#4566 - China 
+0

@WebDev, вы читали пример с 'форма/* [опция]'? '*' Относится к _all_ элементам, имеющим тег 'option'. Вам вообще не нужно знать имена элементов. Вы даже можете использовать '// * [option]'. В последнем случае вам нужно знать только о 'option'. –

+0

ой, извините. Меня смутило коммутатор и перечислил все поля. Я не заметил, что вы только устанавливаете метки в коммутаторе. – Dev

+0

еще один вопрос: как я могу получить опции только из формы блока с tableid = 1? Существует ли такой метод, как '$ items-> xpath ('form [1]/* [option]');' или '$ items-> xpath ('form [2]/* [option]');' – Dev

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