2010-06-07 110 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