2013-11-23 34 views
0

我想使用simplephp循環訪問xml文件。xml解析具有特殊條件的循環

我的訪問代碼是這樣的:

// get the path of the file 
$file = "xml/".$item_name . "_cfg.xml"; 

if(! $xml = simplexml_load_file($file)){ 
    echo 'unable to load XML file'; 
} else { 

$item_array = array(); 
foreach($xml->config->exported->item as $items) 
    { 
$item_name = (string) $items->attributes()->name; 
echo "item name: " . $item_name . "<br />"; 
} 

這將回聲出在該XML的所有項名稱的名稱,因爲一些數據是敏感的,但它基本上是這樣的心不是實際的XML與不同的數據一樣。

所以它會顯示爲基於下面的XML如下:

yellow 
blue 
orange 
red 
black 

這裏是XML

<?xml version="1.0"?> 
<main> 
    <config> 
     <exported> 
      <items> 
       <item name="yellow"></item> 
       <item name="blue"></item> 
       <New_Line /> 
       <item name="orange"></item> 
       <item name="red"></item> 
       <New_Line /> 
       <item name="black"></item> 
      </items> 
     </exported> 
    </config> 
<main> 

都很好,但我需要顯示的是:

yellow 
blue 
-------- 
orange 
red 
-------- 
black 

如果你在xml中注意到這個行之間有一些數據

<New_Line /> 

當我遇到我想呼應的幾個短線,但我真的不知道你是怎麼做的,因爲我不太熟悉的SimpleXML

回答

1

可以說,這是結構的一個糟糕的選擇中XML,因爲大概實際上意味着有多個item s集合,因此它應該有一些父代來表示每個單獨的組。儘管如此,使用SimpleXML你想要做的事情非常簡單。

訣竅是use the ->children() method按順序迭代所有子節點,不管名稱如何。然後在該循​​環中,您可以examine the name of each node using ->getName()並決定如何行動。

下面是一個例子(和a live demo of it in action);請注意,我添加了->items以匹配您提供的示例XML,並使用較短的$node['name']而不是$node->attributes()->name

foreach($xml->config->exported->items->children() as $node) 
{ 
    switch ($node->getName()) 
    { 
     case 'item': 
      $item_name = (string)$node['name']; 
      echo "item name: " . $item_name . "<br />"; 
     break; 
     case 'New_Line': 
      echo '<hr />'; 
     break; 
    } 
}