2016-12-16 46 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解析它。函數返回這樣的對象:在PHP中使用simplexml_load_string解析XML

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()); 
    } 
} 

$valueSimpleXMLElement對象,但$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); 
} 

在這個例子中,我使用了一個相對於$items(特別是根元素)的XPath表達式。根據您的需要調整XPath。例如,您可以使用//option獲取文檔中的所有選項。你甚至可能要遍歷下formoption孩子的所有元素:

$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,你閱讀'形式/ * [選項]'的例子嗎? '*'是指具有'option'標籤的_all_元素。你根本不需要知道元素名稱。你甚至可以使用'// * [option]'。在後一種情況下,你只需要知道「選項」。 –

+0

哦,對不起。我被交換和枚舉所有領域弄糊塗了。我沒有注意到你只在開關中設置標籤。 – Dev

+0

還有一個問題:我如何才能從tableid = 1的塊形式獲得選項?它是否存在'$ items-> xpath('form [1]/* [option]');'或'$ items-> xpath('form [2]/* [option]');' – Dev