1

PHPの私のサイトで、次のようなxmlファイルを読みたい:

<?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>

各ノード名DATAに入力して、次のように入力します。
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;
    }

自分の価値を生かすための非常に最適化されたサイクルを作成したい

4

2 に答える 2

2

次のスタイルを使用して<DATA>、ルート要素の子要素のみにアクセスします。

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

また、SimpleXML の概要を確認してください。SimpleXMLで基本的なことを行うさまざまな方法を示す良い例がいくつかあるはずです。ドキュメントはかなり良いです。

于 2013-03-08T14:52:29.477 に答える
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);
}
于 2013-03-07T14:41:46.513 に答える