на моем сайте в 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 и принять:
КОД СТРАНЫ
КОД ВАЛЮТЫ
ИМЯ СТРАНЫ
CURRENCY_NAME
И все города городов-загородников кодируют и называют в ассоциативный массив.
Я пробовал с SimpleXML, но XML является динамическим, и я хочу оптимизировать свой цикл, потому что у меня может быть очень большой и большой XML (это лишь небольшая часть It).
$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; }
Я хочу создать очень отпимовый цикл, чтобы взять мою ценность
Используйте следующий стиль для доступа только к дочерним элементам <DATA>
в корневом элементе:
foreach ($xml->DATA as $name => $part) {
Также, пожалуйста, проверьте SimpleXML Введение, у него должны быть несколько хороших примеров для вас, показывающих разные способы, как делать базовые вещи с помощью SimpleXML. Документация довольно хорошая.
вы можете использовать синтаксический анализатор 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); }
с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); }