2011-02-12 44 views
0

retriving子节点,如果我有这样的XML:问题与SimpleXML中

<field name="gender" type="select1"> 
    <label>Gender</label> 
    <item> 
     <label>Male</label> 
     <value>1</value> 
    </item> 
    <item> 
     <label>Female</label> 
     <value>2</value> 
    </item> 
    <constraints> 
     <required/> 
    </constraints> 
</field> 

假设我必须让每个项目的标签,并创建一个HTML表单。我怎么能做到这一点使用XML对象simplexml的文件print_r的说明这一点:

[item] => Array 
         (
          [0] => SimpleXMLElement Object 
           (
            [label] => Male 
            [value] => 1 
           ) 

          [1] => SimpleXMLElement Object 
           (
            [label] => Female 
            [value] => 2 
           ) 

         ) 

,但在我的代码

foreach($xml as $field) 
    { 
     $type = $xml->field[$i]->attributes()->type ; 
     $name = $xml->field[$i]->attributes()->name ; 
     $required = $xml->field[$i]->constraints[0]->required[0] ; 



      //checkboxes and radios 
      echo $xml->field[$i]->lable ; 
      //check the lable 
      if(is_array($xml->field[$i]->item)) 
      { 
       echo 'yes it\'s a array ' ; 
      } 






     $i++ ; 
    } 

使用此代码

if ($type == 'select1' || $type == 'radio') { 
     foreach ($field->item as $item) { 
      echo "{$item->label} = {$item->value}\n"; 
     } 
    } 

居然还有场的另一台标签由项目标签组成,所以第二个foreach循环将被忽略

<field name="language" type="select"> 
      <label>Language(s)</label> 
      <item> 
       <label>English</label> 
       <value>1</value> 
      </item> 
      <item> 
       <label>French</label> 
       <value>2</value> 
      </item> 
      <item> 
       <label>Persian</label> 
       <value>4</value> 
      </item> 
      <constraints/> 
     </field> 

回答

0

你必须做这样的事情:

$sxml = new SimpleXMLElement($xml); 
foreach ($sxml->field as $field) { 
    $label = $field->label; 
    $type = $field['type']; 
    $name = $field['gender']; 
    $required = isset($field->constraints->required); 

    if ($type == 'select1' || $type == 'radio') { 
     foreach ($field->item as $item) { 
      echo "{$item->label} = {$item->value}\n"; 
     } 
    } 
} 

如果没有任何<items>节点,第二foreach将被忽略。你不必明确检查它。

+0

如果我有更多的节点,我该如何检查它。因为它在第二个foreach循环上重复其他节点 – mehdi 2011-02-12 19:21:51