2014-05-01 162 views
0

是否有一個更清潔的方式來實現這一目標: 的XML是:PHP循環通過XML嵌套循環沒有多個foreach循環?

  <Specifics> 
       <Name> 
        <Type>Brand</Type> 
        <Value>Apple</Value> 
        <Source>list</Source> 
       </Name> 
       <Name> 
        <Type>Country</Type> 
        <Value>USA</Value> 
        <Source>list</Source> 
       </Name> 
       <Name> 
        <Type>Rating</Type> 
        <Value>87</Value> 
        <Source>list</Source> 
       </Name> 
       <Name> 
        <Type>Project</Type> 
        <Value>Dolphin</Value> 
        <Source>list</Source> 
       </Name> 
       <Name> 
        <Type>Age</Type> 
        <Value>10-20</Value> 
        <Source>list</Source> 
       </Name> 
      </Specifics> 

它工作正常似乎只是笨拙以下。有沒有更好的方法來獲得type,valuesource的所有值?

   foreach($xml->Specifics as $specs) { 
        foreach($specs->Name as $name) { 
         foreach($name->children() as $child) { 
          echo $child->getName() . ": " . $child . "<br>"; 
         } 
        }     
       } 
+0

你可以使用遞歸的每個元素及其子迭代。 – CoDEmanX

回答

1

您可以使用Xpath。如果我理解正確,你想迭代name元素並從他們的孩子讀取數據。 SimpleXML也具有有限的xpath支持。但我更喜歡直接使用DOM。

$dom = new DOMDocument(); 
$dom->loadXml($xml); 
$xpath = new DOMXpath($dom); 

// iterate all `Name` elements anywhere in the document 
foreach ($xpath->evaluate('//Name') as $nameNode) { 
    var_dump(
    [ 
     // fetch first `Type` element in $nameNode and cast it to string 
     $xpath->evaluate('string(Type)', $nameNode), 
     $xpath->evaluate('string(Value)', $nameNode), 
     $xpath->evaluate('string(Source)', $nameNode) 
    ] 
); 
} 
0

像THW did answer,我想說,以及該XPath是去訪問Specifics/Names的方式。當你標記這個simplexml的,還有還有某種矮個子,你的情況,獲得命名的值:

foreach ($xml->xpath('/*//Specifics/Name') as $name) 
{ 
    print_r(array_map('strval', iterator_to_array($name))); 
} 

輸出:

Array 
(
    [Type] => Brand 
    [Value] => Apple 
    [Source] => list 
) 
Array 
(
    [Type] => Country 
    [Value] => USA 
    [Source] => list 
) 
Array 
(
    [Type] => Rating 
    [Value] => 87 
    [Source] => list 
) 
Array 
(
    [Type] => Project 
    [Value] => Dolphin 
    [Source] => list 
) 
Array 
(
    [Type] => Age 
    [Value] => 10-20 
    [Source] => list 
)