2013-03-07 100 views
1

在我的PHP的網站我想讀取XML文件是這樣的:讀取XML動態PHP

<?xml version="1.0" standalone="yes"?> 
<RETURNDATA lang="it-IT" type="COR" xsi:noNamespaceSchemaLocation="http://xmlv5test.travco.co.uk/trlink/schema/CountryRequestV6Rcv.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <MESSAGE>All Countries details and relevant city details</MESSAGE> 
    <DATA COUNTRY_CODE="ABW" CURRENCY_CODE="EUR"> 
     <COUNTRY_NAME>Aruba</COUNTRY_NAME> 
     <CURRENCY_NAME>euro</CURRENCY_NAME> 
     <COUNTRY_CITIES> 
      <CITY_DATA CITY_CODE="AUA"> 
       <CITY_NAME>Aruba</CITY_NAME> 
      </CITY_DATA> 
     </COUNTRY_CITIES> 
    </DATA> 
    <DATA COUNTRY_CODE="ALB" CURRENCY_CODE="EUR"> 
     <COUNTRY_NAME>Albania</COUNTRY_NAME> 
     <CURRENCY_NAME>euro</CURRENCY_NAME> 
     <COUNTRY_CITIES> 
      <CITY_DATA CITY_CODE="TIA"> 
       <CITY_NAME>Tirana</CITY_NAME> 
      </CITY_DATA> 
     </COUNTRY_CITIES> 
    </DATA> 
    <DATA COUNTRY_CODE="ARE" CURRENCY_CODE="EUR"> 
     <COUNTRY_NAME>Emirati Arabi Uniti</COUNTRY_NAME> 
     <CURRENCY_NAME>euro</CURRENCY_NAME> 
     <COUNTRY_CITIES> 
      <CITY_DATA CITY_CODE="DXB"> 
       <CITY_NAME>Dubai</CITY_NAME> 
      </CITY_DATA> 
      <CITY_DATA CITY_CODE="AAI"> 
       <CITY_NAME>Al Ain</CITY_NAME> 
      </CITY_DATA> 
      <CITY_DATA CITY_CODE="FJR"> 
       <CITY_NAME>Fujaira</CITY_NAME> 
      </CITY_DATA> 
      <CITY_DATA CITY_CODE="SSH"> 
       <CITY_NAME>Sharja</CITY_NAME> 
      </CITY_DATA> 
      <CITY_DATA CITY_CODE="RKT"> 
       <CITY_NAME>Ras al-Khaimah</CITY_NAME> 
      </CITY_DATA> 
      <CITY_DATA CITY_CODE="AUH"> 
       <CITY_NAME>Abu Dhabi</CITY_NAME> 
      </CITY_DATA> 
     </COUNTRY_CITIES> 
    </DATA> 
</RETURNDATA> 

我想在每個節點名稱要輸入的數據,並採取:
COUNTRY_CODE
CURRENCY_CODE
COUNTRY_NAME
CURRENCY_NAME
而且所有的國家城市代碼和名字都變成了數組關聯。

我已經嘗試過使用SimpleXML,但是XML是動態的,我想優化我的循環,因爲我可以有一個很大很大的XML(這只是它的一小部分)。

$xml_str = file_get_contents('xml/country.xml'); 
    $xml = new SimpleXMLElement($xml_str); 
    echo $xml->getName(), PHP_EOL; 
    foreach($xml as $name => $part) { 
     echo "$name: $part", PHP_EOL; 
    } 

我想創建一個非常otpimize週期把我的價值

+0

什麼不適用於您的代碼?我的意思是什麼是具體問題? SimpleXML通常可以正常工作,但是您不會在專門爲您工作的地方編寫代碼。你可能應該在你的問題中說,這樣可以回答;) – hakre 2013-03-07 17:24:52

+0

我想以最高效的模式檢索我的數據@hakre – 2013-03-07 17:38:59

+0

定義「高效模式」。這可能意味着很多。爲什麼你說現在效率不高? – hakre 2013-03-07 17:42:54

回答

1

使用以下樣式僅訪問根元素中的子元素:

foreach ($xml->DATA as $name => $part) { 

也請檢查SimpleXML Introduction它應該有一些很好的例子給你展示如何用SimpleXML做基本的東西。這些文檔相當不錯。

1

,你可以直接使用XML解析器,這將更有可能是最有效的方式

set_time_limit(0); 
define('__BUFFER_SIZE__', 131072); 
define('__XML_FILE__', 'pf_1360591.xml'); 

function elementStart($p, $n, $a) { 
    //handle opening of elements 
} 

function elementEnd($p, $n) { 
    //handle closing of elements 
} 

function elementData($p, $d) { 
    //handle cdata in elements 
} 

$xml = xml_parser_create(); 

xml_parser_set_option($xml, XML_OPTION_TARGET_ENCODING, 'UTF-8'); 
xml_parser_set_option($xml, XML_OPTION_CASE_FOLDING, 0); 
xml_parser_set_option($xml, XML_OPTION_SKIP_WHITE, 1); 

xml_set_element_handler($xml, 'elementStart', 'elementEnd'); 
xml_set_character_data_handler($xml, 'elementData'); 

$f = fopen(__XML_FILE__, 'r'); 
if($f) { 
    while(!feof($f)) { 
    $content = fread($f, __BUFFER_SIZE__); 

    xml_parse($xml, $content, feof($f)); 

    unset($content); 
    } 
    fclose($f); 
} 
+0

好吧,但在我的情況下,採取我的價值,這是最好的模式來檢索我的信息? – 2013-03-07 14:48:29