2010-09-02 225 views

回答

16

嘗試用simple XML,這裏有一個例子:

do.php:

<?php 
$xml_str = file_get_contents('xmlfile.xml'); 
$xml = new SimpleXMLElement($xml_str); 
$items = $xml->xpath('*/item'); 

foreach($items as $item) { 
    echo $item['title'], ': ', $item['description'], "\n"; 
} 

xmlfile.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<xml> 
    <items> 
     <item title="Hello World" description="Hellowing the world.." /> 
     <item title="Hello People" description="greeting people.." /> 
    </items> 
</xml> 
11

對於那些SimpleXML的是那些情況不可用,我使用此功能最初張貼在ph值的評論p.net。它在99%的時間內很好地工作。

<?php 
/** 
* Convert XML to an Array 
* 
* @param string $XML 
* @return array 
*/ 
function XMLtoArray($XML) 
{ 
    $xml_parser = xml_parser_create(); 
    xml_parse_into_struct($xml_parser, $XML, $vals); 
    xml_parser_free($xml_parser); 
    // wyznaczamy tablice z powtarzajacymi sie tagami na tym samym poziomie 
    $_tmp=''; 
    foreach ($vals as $xml_elem) { 
     $x_tag=$xml_elem['tag']; 
     $x_level=$xml_elem['level']; 
     $x_type=$xml_elem['type']; 
     if ($x_level!=1 && $x_type == 'close') { 
      if (isset($multi_key[$x_tag][$x_level])) 
       $multi_key[$x_tag][$x_level]=1; 
      else 
       $multi_key[$x_tag][$x_level]=0; 
     } 
     if ($x_level!=1 && $x_type == 'complete') { 
      if ($_tmp==$x_tag) 
       $multi_key[$x_tag][$x_level]=1; 
      $_tmp=$x_tag; 
     } 
    } 
    // jedziemy po tablicy 
    foreach ($vals as $xml_elem) { 
     $x_tag=$xml_elem['tag']; 
     $x_level=$xml_elem['level']; 
     $x_type=$xml_elem['type']; 
     if ($x_type == 'open') 
      $level[$x_level] = $x_tag; 
     $start_level = 1; 
     $php_stmt = '$xml_array'; 
     if ($x_type=='close' && $x_level!=1) 
      $multi_key[$x_tag][$x_level]++; 
     while ($start_level < $x_level) { 
      $php_stmt .= '[$level['.$start_level.']]'; 
      if (isset($multi_key[$level[$start_level]][$start_level]) && $multi_key[$level[$start_level]][$start_level]) 
       $php_stmt .= '['.($multi_key[$level[$start_level]][$start_level]-1).']'; 
      $start_level++; 
     } 
     $add=''; 
     if (isset($multi_key[$x_tag][$x_level]) && $multi_key[$x_tag][$x_level] && ($x_type=='open' || $x_type=='complete')) { 
      if (!isset($multi_key2[$x_tag][$x_level])) 
       $multi_key2[$x_tag][$x_level]=0; 
      else 
       $multi_key2[$x_tag][$x_level]++; 
      $add='['.$multi_key2[$x_tag][$x_level].']'; 
     } 
     if (isset($xml_elem['value']) && trim($xml_elem['value'])!='' && !array_key_exists('attributes', $xml_elem)) { 
      if ($x_type == 'open') 
       $php_stmt_main=$php_stmt.'[$x_type]'.$add.'[\'content\'] = $xml_elem[\'value\'];'; 
      else 
       $php_stmt_main=$php_stmt.'[$x_tag]'.$add.' = $xml_elem[\'value\'];'; 
      eval($php_stmt_main); 
     } 
     if (array_key_exists('attributes', $xml_elem)) { 
      if (isset($xml_elem['value'])) { 
       $php_stmt_main=$php_stmt.'[$x_tag]'.$add.'[\'content\'] = $xml_elem[\'value\'];'; 
       eval($php_stmt_main); 
      } 
      foreach ($xml_elem['attributes'] as $key=>$value) { 
       $php_stmt_att=$php_stmt.'[$x_tag]'.$add.'[$key] = $value;'; 
       eval($php_stmt_att); 
      } 
     } 
    } 
    return $xml_array; 
} 
?> 
2

如果你熟悉Zend框架,通過你的XML Zend_Config_Xml中

給出這樣的XML

$myXml = ' 
<?xml version="1.0" ?> 
<top> 
    <var>value</var> 
    <nested> 
    <var>value</var> 
    </nested> 
    <arrayVar> 
    <item>1</item> 
    <item>2</item> 
    <item>3</item>   
    </arrayVar> 
</top>'; 

可正是如此訪問:

$xml = new Zend_Config_Xml($myXml); 

$var = $xml->var; 
$nestedVar = $xml->nested->var; 
$arrayVar = $xml->arrayVar->toArray(); 

Zend Config XML使用simplexml,並在此基礎上提供一個不錯的界面,這使得它非常容易實現您正在查找的xml節點。

ZF手冊中有更多的負載,包括如何訪問屬性以及一些其他非常有用的功能。

http://framework.zend.com/manual/en/zend.config.adapters.xml.html

Zend的配置是最容易使用ZF的零部件之一,(我認爲)這是一個獨立的組件,你可以只使用Zend的配置和ZF

的任何其他部分