2010-06-07 140 views
1

你好,我成功創建了我的解析器 除了一件事情之外,一切都很好,因爲我的XML被格式化了一些不同,我完全失去了如何爲<photos>的子項指定變量。用php解析xml,子女

+1

我不知道你的代碼是應該做的,你的問題是什麼。你想讀取給定的XML結構並將相應的信息存儲在數據庫表中,對嗎?我注意到你連接字符串$ photos中的字符數據,但從未使用過。這是你的問題是關於什麼? – mkluwe 2010-06-07 08:14:27

+0

yes確實.......... – 2010-06-07 09:58:49

回答

2

我認爲將XML數據解析爲像結構樹一樣會很有幫助。我這樣做是爲了你,看看這裏:

<?php 
$data = ' 
<item> 
    <url /> 
    <name /> 
    <photos> 
    <photo>1020944_0.jpg</photo> 
    <photo>1020944_1.jpg</photo> 
    <photo>1020944_2.jpg</photo> 
    </photos> 
    <user_id /> 
</item>'; 

$tree = array(); 
$stack = array(&$tree); 

function startElement($parser, $name, $attrs) { 
    global $stack; 
    $t = &$stack[ count($stack) - 1 ]; 
    $t[ $name ][] = array(); 
    $n = count($t[ $name ]); 
    array_push($stack, &$t[ $name ][ $n - 1 ]); 
} 

function endElement($parser, $name) { 
    global $stack; 
    array_pop($stack); 
} 

function characterData($parser, $data) { 
    global $stack; 
    $t = &$stack[ count($stack) - 1 ]; 
    $t[ '#CDATA' ] = trim($data); 
} 

$xml_parser = xml_parser_create(); 
xml_set_element_handler($xml_parser, "startElement", "endElement"); 
xml_set_character_data_handler($xml_parser, "characterData"); 
xml_parse($xml_parser, $data, TRUE); 

foreach($tree[ 'ITEM' ][ 0 ][ 'PHOTOS' ][ 0 ][ 'PHOTO' ] as $photo) { 
    echo "{$photo[ '#CDATA' ]}\n"; 
} 
?> 

其實,我有(業餘)重新實現什麼樣的SimpleXML已經給你:

<?php 
$xml = new SimpleXMLElement($data); 
foreach($xml->photos->photo as $photo) { 
    echo "$photo\n"; 
} 
?> 
+0

+/- 0,最好的解決方案是使用SimpleXML庫,自己解析它是不必要的(除非XML非常大(> 10MB)並且它很糟糕保持這樣的解決方案。 – dbemerlin 2010-06-07 10:50:48