2013-09-16 144 views
1

我正在嘗試創建一個通用PHP類來啓用XML數據的檢索。數據都以相似的格式出現,但會有不同的元素名稱,有時可能會有更多的元素。示例XML:在不知道元素名稱的情況下獲取XML元素內容PHP

一個供給可能會出現這樣的:

<GroupData> 
    <Table diff:id="1"> 
     <Code>1</Code> 
     <Name>Red</Name> 
     <Type>X</Type> 
    </Table> 
    <Table diff:id="2"> 
     <Code>2</Code> 
     <Name>Yellow</Name> 
     <Type>Y</Type> 
    </Table> 
</GroupData> 

另一種飼料可能會顯示:

<GroupData> 
    <Table diff:id="1"> 
     <Code>1</Code> 
     <Name>Red</Name> 
    </Table> 
    <Table diff:id="2"> 
     <Code>2</Code> 
     <Name>Yellow</Name> 
    </Table> 
</GroupData> 

我的PHP是這樣的:

$dom = DOMDocument::loadXML($xml); 

$node_list = $dom->getElementsByTagName('Table'); 

for($i=0; $i < $node_list->length; $i++) { 

    echo $node_list->item($i)->nodeValue; 

} 

這使回的數據,但它不是我想要的。我想分解出來,以便我可以看到元素名稱和元素值,然後從數據中創建一個數組以備將來使用。有沒有辦法做到這一點,而不使用「getElementsByTagName」這是我以前用於獲取XML?我知道我收到的每個Feed都會有Table,因此每次都可以循環播放。 感謝您的幫助。

+0

嘗試http://php.net/manual/en/domxpath.query.php並使用正確的選擇 –

回答

2

getElementsByTagName()看起來合適。代碼應該是這樣的:

$doc = new DOMDocument(); 
$doc->loadXML($xml); 

$tables = $doc->getElementsByTagName('Table'); 
$data = array(); 
foreach($tables as $table) { 
    $id = $table->getAttribute('id'); 
    $record = array(); 
    foreach($table->childNodes as $child) { 
     if($child->nodeType === XML_ELEMENT_NODE) { 
      $record[$child->nodeName] = $child->nodeValue; 
     } 
    } 
    $data[$id] = $record; 
} 

var_dump($data); 

該代碼創建多維陣列,其中第一維的索引是表id和第二維是具有從XML鍵/值對的陣列。我簡化了一下,並刪除了這個例子的diff:命名空間前綴,因爲它們在你顯示的代碼片段中是無效的(未註冊)。在真實世界的代碼中,您將需要getAttributeNS('diff', 'id')

這會給你:

array(2) { 
    [1] => 
    array(3) { 
    'Code' => 
    string(1) "1" 
    'Name' => 
    string(3) "Red" 
    'Type' => 
    string(1) "X" 
    } 
    [2] => 
    array(3) { 
    'Code' => 
    string(1) "2" 
    'Name' => 
    string(6) "Yellow" 
    'Type' => 
    string(1) "Y" 
    } 
} 
+0

美妙,工作一種享受!謝謝!! – 30secondstosam

+0

歡迎您! :)也要關心我對這個命名空間'diff的說法:' – hek2mgl

+0

確實 - 謝謝。 – 30secondstosam

相關問題