2016-12-16 16 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 
         ) 

       ) 

     ) 

) 

私は町のオプションから2番目の属性値を持っていません。どうすれば入手できますか? 私のコード:

/** @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で取り出すことができます。それともあなたも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、あなたは 'フォーム/ * [オプション]'との例を読んだことがありますか? '*'は 'option'タグを持つ_all_要素を指します。要素名はまったく知る必要はありません。あなたは '// * [option]'を使うことさえあります。後者の場合、 'option'についてのみ知る必要があります。 –

+0

ああ、申し訳ありません。私はスイッチと列挙のすべてのフィールドで混乱していた。私はスイッチでラベルを設定することに気付かなかった。 – Dev

+0

もう1つ質問:tableid = 1のブロックフォームからのみオプションを取得するにはどうすればよいですか? '$ items-> xpath( 'form [1]/* [option]');または$ items-> xpath( 'form [2]/* [option]'); ' – Dev

関連する問題