XML синтактичен анализ. Пропуснете елементите, от които не се нуждаете

Разборът на XML по същество означава преминаване през XML документ и връщане на съответните данни. Въпреки че все по-голям брой уеб услуги връщат данни във формат JSON, повечето все още използват XML, така че е важно да овладеете анализа на XML, ако искате да използвате пълния набор от налични API.

Използване на разширението SimpleXMLв PHP, който беше добавен обратно в PHP 5.0, работата с XML е много лесна и проста. В тази статия ще ви покажа как да го направите.

Основи на употреба

Нека започнем със следния пример езици.xml:


>

> 1972>
> Денис Ричи >
>

> 1995>
> Расмус Лердорф >
>

> 1995>
> Джеймс Гослинг >
>
>

Този XML документ съдържа списък с езици за програмиране с известна информация за всеки език: годината на неговото прилагане и името на неговия създател.

Първата стъпка е да заредите XML с помощта на функциите simplexml_load_file()или simplexml_load_string(). Както подсказва името на функциите, първата ще зареди XML от файл, а втората ще зареди XML от низ.

И двете функции четат цялото DOM дърво в паметта и връщат обект SimpleXMLElement. В примера по-горе обектът се съхранява в променливата $languages. Можете да използвате функции var_dump()или print_r()за да получите подробна информация за върнатия обект, ако желаете.

SimpleXMLElement обект
[lang] => Масив
[ 0 ] => SimpleXMLElementObject
[@attributes] => Масив
[име] => C
[появи се] => 1972 г
[създател] => Денис Ричи
[ 1 ] => SimpleXMLElement обект
[@attributes] => Масив
[име] => PHP
[появи се] => 1995 г
[създател] => Расмус Лердорф
[ 2 ] => SimpleXMLElement обект
[@attributes] => Масив
[име] => Java
[появи се] => 1995 г
[създател] => Джеймс Гослинг
)
)

Този XML съдържа основния елемент езици, който съдържа три елемента езикВсеки елемент от масива съответства на елемент езикв XML документ.

Можете да получите достъп до свойствата на обект с помощта на оператора -> . Например, $languages->lang ще ви върне обект SimpleXMLElement, който съответства на първия елемент език. Този обект съдържа две свойства: появил се и създател.

$languages ​​-> lang [ 0 ] -> се появи ;
$languages ​​-> lang [0] -> създател;

Показването на списък с езици и показването на техните свойства е много лесно със стандартен цикъл, като напр за всеки.

foreach ($languages ​​-> lang като $lang) (
printf (
"" ,
$lang["name"] ,
$lang -> се появи ,
$lang -> създател
) ;
}

Забележете как получих достъп до името на атрибута на елемента lang, за да получа името на езика. По този начин можете да получите достъп до всеки атрибут на елемент, представен като SimpleXMLElement обект.

Работа с пространства от имена

Докато работите с XML на различни уеб услуги, често ще срещате пространства от имена на елементи. Нека променим нашите езици.xmlза да покажете пример за използване на пространство от имена:



xmlns:dc =>

> 1972>
> Денис Ричи >
>

> 1995>
> Расмус Лердорф >
>

> 1995>
> Джеймс Гослинг >
>
>

Сега елемент създателпоставени в пространството за имена DC, което сочи към http://purl.org/dc/elements/1.1/. Ако се опитате да отпечатате създателите на езика, като използвате предишния ни код, няма да работи. За да четете пространства от имена на елементи, трябва да използвате един от следните подходи.

Първият подход е да се използват имената на URI директно в кода, когато се позовава на пространството от имена на елемента. Следният пример показва как се прави това:

$dc = $languages ​​-> lang [ 1 ] -> children( "http://purl.org/dc/elements/1.1/") ;
ехо $dc -> създател;

Метод деца()взема пространство от имена и връща дъщерни елементи, които започват с префикс. Необходими са два аргумента, първият е пространството от имена на XML, а вторият е незадължителен аргумент, който е по подразбиране фалшиво. Ако вторият аргумент е зададен на TRUE, пространството от имена ще се третира като префикс. Ако е FALSE, тогава пространството от имена ще се третира като пространство от имена на URL адреси.

Вторият подход е да прочетете имената на URI от документа и да ги използвате, когато се позовавате на пространството от имена на елемента. Това всъщност е най-добрият начин за достъп до елементи, защото не е нужно да бъдете твърдо кодирани в URI.

$namespaces = $languages ​​-> getNamespaces (true);
$dc = $languages ​​-> lang [ 1 ] -> деца ($namespaces [ "dc" ] ) ;

ехо $dc -> създател;

Метод GetNamespaces()връща масив от имена на префикси и свързаните с тях URI. Той изисква допълнителен параметър, който е по подразбиране фалшиво. Ако го инсталирате като вярно, тогава този метод ще върне имената, използвани в родителски и дъщерни възли. В противен случай той намира пространства от имена, използвани само в родителския възел.

Сега можете да преглеждате списъка с езици по следния начин:

$languages ​​= simplexml_load_file ("languages.xml");
$ns = $languages ​​-> getNamespaces (true);

foreach ($languages ​​-> lang като $lang) (
$dc = $lang -> деца ($ns [ "dc" ] ) ;
printf (
"

%s се появи в %d и беше създаден от %s.

" ,
$lang["name"] ,
$lang -> се появи ,
$dc -> създател
) ;
}

Казус - Разбор на видео канал в YouTube

Нека разгледаме пример, който получава RSS емисия от канал в YouTube и показва връзки към всички видеоклипове от него. За да направите това, моля свържете се със следния адрес:

http://gdata.youtube.com/feeds/api/users/xxx/uploads

URL адресът връща списък с най-новите видеоклипове от дадения канал в XML формат. Ще анализираме XML и ще получим следната информация за всеки видеоклип:

  • Линк към видео
  • Миниатюрни
  • име

Ще започнем с търсене и зареждане на XML:

$channel = "Име на канал" ;
$url = "http://gdata.youtube.com/feeds/api/users/". $канал. "/качвания" ;
$xml = file_get_contents ($url) ;

$feed = simplexml_load_string ($xml) ;
$ns = $feed -> getNameSpaces (true) ;

Ако погледнете XML канала, можете да видите, че там има няколко елемента. субект, всеки от които съхранява подробна информация за конкретно видео от канала. Но ние използваме само миниатюри на изображения, видео адрес и заглавие. Тези три елемента са деца на елемента група, което от своя страна е дете на влизане:

>

>



Заглавие... >

>

>

Просто ще преминем през всички елементи влизане, и извлечете необходимата информация за всеки от тях. отбележи, че играч, миниатюраи заглавиеса в пространството от имена на медиите. Следователно трябва да продължим както в предишния пример. Получаваме имената от документа и използваме пространството от имена, когато се позоваваме на елементите.

foreach ($feed -> запис като $entry) (
$group = $entry -> деца ($ns [ "медия" ] ) ;
$група = $група -> група;
$thumbnail_attrs = $група -> миниатюра [1] -> атрибути () ;
$image = $thumbnail_attrs [ "url"] ;
$player = $group -> player -> attributes () ;
$link = $player["url"] ;
$title = $група -> заглавие;
printf ( "

" ,
$player, $image, $title);
}

Заключение

Сега, когато знаете как да използвате SimpleXMLза да анализирате XML данни, можете да подобрите уменията си, като анализирате различни XML емисии с различни API. Но е важно да имате предвид, че SimpleXML чете целия DOM в паметта, така че ако анализирате голям набор от данни, може да останете без памет. За да научите повече за SimpleXML, прочетете документацията.


Ако имате въпроси, моля използвайте нашия

Сега ще изучаваме работа с XML. XML е формат за обмен на данни между сайтове. Той е много подобен на HTML, само XML позволява свои собствени тагове и атрибути.

Защо е необходим XML за синтактичен анализ? Понякога се случва сайтът, който трябва да анализирате, да има API, който ви позволява да получите това, което искате, без много усилия. Затова незабавно съвет - преди да анализирате сайта, проверете дали има API.

Какво е API? Това е набор от функции, с които можете да изпратите заявка до този сайт и да получите желания отговор. Този отговор най-често идва във формат XML. Така че нека започнем да го изучаваме.

Работа с XML в PHP

Да приемем, че имате XML. Може да бъде в низ, да се съхранява във файл или да се сервира при поискване до конкретен URL.

Нека XML се съхранява в низ. В този случай трябва да създадете обект от този ред с помощта на нов SimpleXMLElement:

$str = " Коля 25 1000 "; $xml = нов SimpleXMLElement($str);

Сега имаме в променлива $xmlсе съхранява обект с анализиран XML. Чрез достъп до свойствата на този обект можете да получите достъп до съдържанието на XML таговете. Как точно - ще анализираме малко по-надолу.

Ако XML се съхранява във файл или се дава чрез достъп до URL (което най-често се случва), тогава трябва да използвате функцията simplexml_load_fileкоето прави същия обект $xml:

Коля 25 1000

$xml = simplexml_load_file(път на файла или url);

Методи на работа

В примерите по-долу нашият XML се съхранява във файл или URL.

Нека бъде даден следният XML:

Коля 25 1000

Нека вземем името, възрастта и заплатата на служителя:

$xml = simplexml_load_file(път на файла или url); echo $xml->name; //показва "Kolya" echo $xml->age; //извежда 25 echo $xml->заплата; // извежда 1000

Както можете да видите, $xml обектът има свойства, съответстващи на таговете.

Може да сте забелязали, че етикетът не се появява никъде в обращение. Това е така, защото това е основният маркер. Можете да го преименувате например на - и нищо няма да се промени:

Коля 25 1000

$xml = simplexml_load_file(път на файла или url); echo $xml->name; //показва "Kolya" echo $xml->age; //извежда 25 echo $xml->заплата; // извежда 1000

В XML може да има само един основен маркер, точно както основния маркер в обикновен HTML.

Нека модифицираме малко нашия XML:

Коля 25 1000

В този случай получаваме верига от обаждания:

$xml = simplexml_load_file(път на файла или url); echo $xml->worker->name; //показва ехо "Коля" $xml->worker->age; //извежда 25 echo $xml->worker->platary; // извежда 1000

Работа с атрибути

Нека някои данни се съхраняват в атрибути:

Номер 1

$xml = simplexml_load_file(път на файла или url); echo $xml->worker["name"]; //показва "Kolya" echo $xml->worker["age"]; //извежда 25 echo $xml->worker["salary"]; //извежда 1000 echo $xml->worker; // отпечатва "Номер 1"

Етикети с тирета

В XML са разрешени тагове (и атрибути) с тире. В този случай достъпът до такива тагове се осъществява по следния начин:

Коля Иванов

$xml = simplexml_load_file(път на файла или url); echo $xml->worker->(first-name); //показва ехо "Коля" $xml->worker->(last-name); //показва "Иванов"

Итерация на цикъл

Нека сега имаме не един работник, а няколко. В този случай можем да повторим нашия обект с цикъл foreach:

Коля 25 1000 Вася 26 2000 Петър 27 3000

$xml = simplexml_load_file(път на файла или url); foreach ($xml като $worker) ( echo $worker->name; //отпечатва "Коля", "Вася", "Петя" )

От обект към нормален масив

Ако не се чувствате комфортно да работите с обект, можете да го преобразувате в нормален PHP масив със следния трик:

$xml = simplexml_load_file(път на файла или url); var_dump(json_decode(json_encode($xml), true));

Повече информация

Синтактичен анализ на базата на sitemap.xml

Често сайтът има файл sitemap.xml. Този файл съхранява връзки към всички страници на сайта за удобство при индексирането им от търсачките (индексирането всъщност е анализиране на сайта от Yandex и Google).

Като цяло не трябва да се интересуваме много защо е необходим този файл, основното е, че ако съществува, не можете да се изкачвате по страниците на сайта по никакви трудни методи, а просто да използвате този файл.

Как да проверите наличието на този файл: нека анализираме сайта site.ru, след което се обърнем към site.ru/sitemap.xml в браузъра - ако видите нещо, значи е там, а ако не го виждате, тогава уви.

Ако има карта на сайта, тогава тя съдържа връзки към всички страници на сайта в XML формат. Чувствайте се свободни да вземете този XML, да го анализирате, отделете връзки към страниците, от които се нуждаете, по всеки удобен за вас начин (например, като анализирате URL адреса, който е описан в метода на паяка).

В резултат на това получавате списък с връзки за синтактичен анализ, остава само да отидете до тях и да анализирате съдържанието, от което се нуждаете.

Прочетете повече за устройството sitemap.xml в уикипедия.

какво правите след това:

Започнете да решавате задачи на следния линк: задачи за урока.

Когато всичко е решено - отидете на изучаване на нова тема.


публикуването на тази статия е разрешено само с връзка към сайта на автора на статията

В тази статия ще покажа пример как да анализирате голям XML файл. Ако вашият сървър (хостинг) не забранява увеличаването на времето за изпълнение на скрипта, тогава можете да анализирате XML файл с тегло най-малко гигабайта, аз лично анализирах само файлове от озон с тегло 450 мегабайта.

Има два проблема при анализиране на големи XML файлове:
1. Няма достатъчно памет.
2. Няма достатъчно време, за да работи скриптът.

Вторият проблем с времето може да бъде решен, ако това не е забранено от сървъра.
Но проблемът с паметта е труден за решаване, дори ако говорим за вашия собствен сървър, тогава преместването на файлове от 500 мегабайта не е много лесно и дори на хостинг и на VDS просто не можете да увеличите паметта.

PHP има няколко вградени опции за XML обработка - SimpleXML, DOM, SAX.
Всички тези опции са описани подробно в много примерни статии, но всички примери показват как да работите с пълен XML документ.

Ето един пример, получаваме обект от XML файл

Сега можете да обработите този обект, НО...
Както можете да видите, целият XML файл се чете в паметта, след което всичко се анализира в обект.
Тоест всички данни влизат в паметта и ако разпределената памет не е достатъчна, тогава скриптът спира.

Тази опция не е подходяща за обработка на големи файлове, трябва да четете файла ред по ред и да обработвате тези данни на свой ред.
В същото време проверката за валидност се извършва и при обработката на данните, така че трябва да можете да връщате назад, например, да изтриете цялата база данни, въведена в случай на невалиден XML файл, или да направите два преминавания през файла, първо прочетете за валидност, след това прочетете за обработка на данни.

Ето един теоретичен пример за синтактичен анализ на голям XML файл.
Този скрипт чете един символ от файл, събира тези данни в блокове и ги изпраща на XML анализатора.
Този подход напълно решава проблема с паметта и не причинява натоварване, но изостря проблема с времето. Как да се опитате да разрешите проблема с времето, прочетете по-долу.

Функция webi_xml($file)
{

########
### функция за обработка на данни

{
отпечатайте $data ;
}
############################################



{
отпечатайте $name ;
print_r($attrs);
}


## функция за затварящ таг
функция endElement ($parser, $name)
{
отпечатайте $name ;
}
############################################

($xml_parser, "данни");

// отвори файл
$fp = fopen($file, "r");

$perviy_vxod = 1; $data = "" ;



{

$simvol = fgetc($fp); $data .= $simvol;


if($simvol != ">" ) (продължи;)


ехо"

прекъсване;
}

$data = "" ;
}
fclose($fp);

webi_xml("1.xml");

?>

В този пример поставих всичко в една функция webi_xml () и нейното извикване се вижда най-отдолу.
Самият скрипт се състои от три основни функции:
1. Функция, която улавя отварянето на маркера startElement().
2. Функция, която улавя затварянето на тага endElement().
3. И функцията за получаване на данни data() .

Да приемем, че съдържанието на файл 1.xml е някаква рецепта



< title >обикновен хляб
< ingredient amount = "3" unit = "стакан" >Брашно
< ingredient amount = "0.25" unit = "грамм" >Дрожди
< ingredient amount = "1.5" unit = "стакан" >топла вода
< ingredient amount = "1" unit = "чайная ложка" >Сол
< instructions >
< step > Смесете всички съставки и омесете старателно.
< step > Покрийте с кърпа и оставете за един час на топло помещение.
< step > Омесете отново, сложете върху тава за печене и сложете във фурната.
< step > Посетете сайта на сайта


Започваме с извикване на общата функция webi_xml("1.xml");
По-нататък в тази функция парсерът стартира и всички имена на тагове се преобразуват в главни букви, така че всички тагове да имат един и същ регистър.

$xml_parser = xml_parser_create();
xml_parser_set_option ($xml_parser, XML_OPTION_CASE_FOLDING, true);

Сега уточняваме кои функции ще работят за улавяне на отваряне на етикета, затваряне и обработка на данни

xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "данни");

Следва отварянето на посочения файл, итерирайте файла един знак наведнъж и всеки знак се добавя към низовата променлива, докато знакът не бъде намерен > .
Ако това е първият достъп до файла, тогава всичко, което е излишно в началото на файла, ще бъде изтрито по пътя, всичко, което стои преди , това е маркерът, с който XML трябва да започне.
Първият път, когато низова променлива ще събере низ

И го изпратете на анализатора
xml_parse ($xml_parser, $data, feof ($fp));
След обработка на данните, низовата променлива се нулира и събирането на данни в низ започва отново и се формира низ за втори път

В третия
</b><br>в четвъртия <br><b>обикновен хляб

Моля, имайте предвид, че низовата променлива винаги се формира от завършения етикет > и не е необходимо да изпращате отворени и затворени тагове с данни към декомпозора, например
обикновен хляб
Важно е този манипулатор да получи цял непрекъснат таг, поне един отворен таг и в следващата стъпка затворен таг, или веднага да получи 1000 реда от файла, няма значение, основното е, че маркерът не се чупи напр

le>Прост хляб
Така че е невъзможно да се изпратят данни до манипулатора, тъй като маркерът е счупен.
Можете да измислите свой собствен метод за изпращане на данни до манипулатора, например да съберете 1 мегабайт данни и да ги изпратите до манипулатора, за да увеличите скоростта, просто се уверете, че етикетите винаги завършват и данните могат да бъдат разбити
прост</b><br><b>хляб

Така на части, както желаете, можете да изпратите голям файл на манипулатора.

Сега нека разгледаме как се обработват тези данни и как да ги получим.

Започвайки с функцията за отваряне на тагове startElement ($parser, $name, $attrs)
Да приемем, че обработката е достигнала линията
< ingredient amount = "3" unit = "стакан" >Брашно
Тогава вътре във функцията променливата $name ще бъде равна на съставкатоест името на отворения таг (въпросът все още не е стигнал до затварянето на етикета).
Също така в този случай ще бъде наличен масив от атрибути на този маркер $attrs, в който ще има данни количество = "3" и единица = "стъкло".

След това данните от отворения таг бяха обработени от функцията данни ($parser, $data)
Променливата $data ще съдържа всичко, което е между отварящия и затварящия таг, в нашия случай това е текстът Muk

И обработката на нашия низ от функцията е завършена endElement ($parser, $name)
Това е името на затворения таг, в нашия случай $name ще бъде равно на съставка

И след това всичко отново премина в пълен кръг.

Горният пример само демонстрира принципа на XML обработка, но за реално приложение трябва да бъде финализиран.
Обикновено трябва да анализирате голям XML, за да въведете данни в базата данни, и за правилна обработка на данните, трябва да знаете към кой отворен маркер принадлежат данните, на какво ниво на влагане на етикети и кои тагове са отворени в йерархията по-горе. С тази информация можете да обработите файла правилно без никакви проблеми.
За да направите това, трябва да въведете няколко глобални променливи, които ще събират информация за отворени тагове, вмъкване и данни.
Ето един пример, който може да се използва

Функция webi_xml($file)
{
глобален $webi_depth; // брояч за проследяване на дълбочината на влагане
$webi_depth = 0 ;
глобален $webi_tag_open ; // ще съдържа масив от текущо отворени тагове
$webi_tag_open = масив ();
глобален $webi_data_temp ; // този масив ще съдържа данните от един таг

####################################################
### функция за обработка на данни
функционални данни ($parser, $data)
{
глобален $webi_depth;
глобален $webi_tag_open ;
глобален $webi_data_temp ;
// добавяне на данни към масива с вложен и текущо отворен маркер
$webi_data_temp [ $webi_depth ][ $webi_tag_open [ $webi_depth ]][ "данни" ].= $data ;
}
############################################

####################################################
### функция за отваряне на етикета
функция startElement ($parser, $name, $attrs)
{
глобален $webi_depth;
глобален $webi_tag_open ;
глобален $webi_data_temp ;

// ако нивото на влагане не е вече нула, тогава един таг вече е отворен
// и данните от него вече са в масива, можете да ги обработите
ако ($webi_depth)
{




" ;

печат"
" ;
print_r($webi_tag_open); // масив от отворени тагове
печат"


" ;

// след обработка на данните ги изтрийте, за да освободите паметта
unset($GLOBALS [ "webi_data_temp" ][ $webi_depth ]);
}

// сега отварянето на следващия таг е започнало и по-нататъшната обработка ще се случи в следващата стъпка
$webi_depth++; // увеличаване на гнезденето

$webi_tag_open [ $webi_depth ]= $name; // добавяне на отворен маркер към информационния масив
$webi_data_temp [ $webi_depth ][ $name ][ "attrs" ]= $attrs ; // сега добавете атрибути на маркера

}
###############################################

#################################################
## функция за затварящ таг
функция endElement ($parser, $name) (
глобален $webi_depth;
глобален $webi_tag_open ;
глобален $webi_data_temp ;

// обработката на данни започва тук, например добавяне към базата данни, записване във файл и т.н.
// $webi_tag_open съдържа верига от отворени тагове по ниво на влагане
// например $webi_tag_open[$webi_depth] съдържа името на отворения маркер, чиято информация в момента се обработва
// Ниво на влагане на маркер $webi_depth
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]["attrs"] масив от атрибути на маркери
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]["data"] данни за маркера

Отпечатайте "данни". $webi_tag_open [ $webi_depth]. "--" .($webi_data_temp [ $webi_depth ][ $webi_tag_open [ $webi_depth ]][ "данни" ]). "
" ;
print_r ($webi_data_temp [ $webi_depth ][ $webi_tag_open [ $webi_depth ]][ "attrs" ]);
печат"
" ;
print_r($webi_tag_open);
печат"


" ;

Unset($GLOBALS [ "webi_data_temp" ]); // след обработка на данните, изтрийте масива с данните като цяло, тъй като маркерът е затворен
unset($GLOBALS [ "webi_tag_open" ][ $webi_depth ]); // премахване на информация за този отворен маркер... след като е затворен

$webi_depth --; // намаляване на гнезденето
}
############################################

$xml_parser = xml_parser_create();
xml_parser_set_option ($xml_parser, XML_OPTION_CASE_FOLDING, true);

// определя кои функции ще работят при отваряне и затваряне на тагове
xml_set_element_handler($xml_parser, "startElement", "endElement");

// задаване на функция за работа с данни
xml_set_character_data_handler($xml_parser, "данни");

// отвори файл
$fp = fopen($file, "r");

$perviy_vxod = 1; // флаг за проверка на първия вход във файла
$data = "" ; // тук събираме части от данните от файла и ги изпращаме на xml анализатора

// цикъл до намерен край на файла
докато (! feof ($fp ) и $fp )
{
$simvol = fgetc($fp); // четене на един знак от файла
$data .= $simvol; // добавяне на този знак към данните, които ще бъдат изпратени

// ако знакът не е крайният маркер, тогава се върнете в началото на цикъла и добавете още един знак към данните и така нататък, докато бъде намерен крайният маркер
if($simvol != ">" ) (продължи;)
// ако е намерен затварящият маркер, сега изпратете събраните данни за обработка

// проверете дали това е първият запис във файла, след което изтрийте всичко преди етикета// тъй като понякога може да има боклук преди началото на XML (тромави редактори или файлът е получен от скрипта от друг сървър)
if($perviy_vxod) ( $data = strstr ($data, "

// сега хвърляме данни в xml анализатора
if (! xml_parse ($xml_parser, $data, feof ($fp ))) (

// тук можете да обработвате и получавате грешки за валидност...
// веднага щом се срещне грешка, синтактичният анализ спира
ехо"
XML грешка: " .xml_error_string (xml_get_error_code ($xml_parser));
ехо "на линия" . xml_get_current_line_number($xml_parser);
прекъсване;
}

// след синтактичен анализ изхвърляме събраните данни за следващата стъпка от цикъла.
$data = "" ;
}
fclose($fp);
xml_parser_free($xml_parser);
// изтриване на глобални променливи
unset($GLOBALS [ "webi_depth" ]);
unset($GLOBALS [ "webi_tag_open" ]);
unset($GLOBALS [ "webi_data_temp" ]);

webi_xml("1.xml");

?>

Целият пример беше придружен от коментари, сега тествайте и експериментирайте.
Моля, имайте предвид, че във функцията за манипулиране на данни данните не се вмъкват просто в масива, а се добавят с помощта на " .=" тъй като данните може да не идват в цяла форма и ако просто направите задание, от време на време ще получавате данни на парчета.

Е, това е всичко, сега ще има достатъчно памет при обработка на файл с всякакъв размер, но времето за изпълнение на скрипта може да се увеличи по няколко начина.
Вмъкнете функция в началото на скрипта
set_time_limit(6000);
или
ini_set("max_execution_time" , "6000" );

Или добавете текст към файла .htaccess
php_value max_execution_time 6000

Тези примери ще увеличат времето за изпълнение на скрипта до 6000 секунди.
Можете да увеличите времето по този начин само в изключен безопасен режим.

Ако имате достъп до редактиране на php.ini, можете да увеличите времето с
max_execution_time = 6000

Например, на хостинг masterhost, към момента на писане на това писане, увеличаването на времето на скрипта е забранено, въпреки деактивирания безопасен режим, но ако сте професионалист, можете да изградите своя php на masterhost, но това не е в тази статия .

Някои от примерите в това ръководство включват XML низ. Вместо да го повтаряте във всеки пример, поставете този ред във файл и го включете във всеки пример. Тази линия е показана в следния пример. Освен това можете да създадете XML документ и да го прочетете с функцията simplexml_load_file().

Пример №1 Example.php файл с XML низ

$xmlstr =<<


PHP: Появява се анализаторът


Госпожица. кодер
Онливия Актора


Г-н. кодер
El ActÓr


Следователно това е език. Все още е език за програмиране. Или
скриптов език ли е? Всичко е разкрито в този документален филм
подобно на филм на ужасите.




7
5


XML
?>

SimpleXML е много лесен за използване! Опитайте да получите някакъв низ или число от основния XML документ.

Пример #2 Получаване на част от документ

включва "example.php" ;

ехо $movies -> филм [ 0 ]-> сюжет ;
?>

Следователно това е език. Все още е език за програмиране. Или това е скриптов език? Всичко е разкрито в този документален филм, който прилича на филм на ужасите.

В PHP можете да получите достъп до елемент в XML документ, който съдържа невалидни знаци (като тире) в името си, като оградите даденото име на елемент в къдрави скоби и апострофи.

Пример #3 Получаване на низ

включва "example.php" ;

ехо $movies -> филм ->( "страхотни редове" )-> ред ;
?>

Резултатът от изпълнението на този пример:

PHP решава всичките ми проблеми в мрежата

Пример #4 Достъп до неуникални елементи в SimpleXML

В случай, че има множество екземпляри на дъщерни елементи в един и същ родителски елемент, тогава трябва да се приложат стандартните методи за итерация.

включва "example.php" ;

$movies = нов SimpleXMLElement($xmlstr);

/* За всеки възел , ще изведем името отделно . */
foreach ($movies -> филм -> символи -> символ като $character ) (
echo $character -> name , " plays " , $character -> actor , PHP_EOL ;
}

?>

Резултатът от изпълнението на този пример:

Госпожица. Кодер играе ролята на Onlivia Actora Mr. Кодер играе El ActÓr

Коментирайте:

Имоти ( $movies->moviesв предишния пример) не са масиви. Това е итерируем обект под формата на масив.

Пример #5 Използване на атрибути

Досега получихме само имената и стойностите на елементите. SimpleXML може също да има достъп до атрибутите на елемента. Атрибутът на елемент може да бъде достъпен по същия начин като елементите на масив ( масив).

включва "example.php" ;

$movies = нов SimpleXMLElement($xmlstr);

/* Достъп до възела първи филм.
* Ще покажем и скалата за оценка. */
foreach ($movies -> филм [ 0 ]-> рейтинг като $rating ) (
switch((string) $rating [ "type" ]) ( // Получаване на атрибути на елемент по индекс
случай "палци":
echo $rating, "палец нагоре";
прекъсване;
случай "звезди":
echo $rating , "звезди" ;
прекъсване;
}
}
?>

Резултатът от изпълнението на този пример:

7 палеца нагоре 5 звезди

Пример #6 Сравняване на елементи и атрибути с текст

За да сравните елемент или атрибут към низ или да го предадете на функция като текст, трябва да го прехвърлите към низ, като използвате (низ). В противен случай PHP ще третира елемента като обект.

включва "example.php" ;

$movies = нов SimpleXMLElement($xmlstr);

if ((низ) $movies -> movie -> title == "PHP: Парсерът се появява") {
печат "Моят любим филм.";
}

echo htmlentities ((низ) $movies -> movie -> title );
?>

Резултатът от изпълнението на този пример:

Моят любим филм PHP: Появява се анализаторът

Пример #7 Сравняване на два елемента

Два SimpleXMLElement се считат за различни, дори ако сочат към един и същ обект от PHP 5.2.0.

включва "example.php" ;

$movies1 = нов SimpleXMLElement($xmlstr);
$movies2 = нов SimpleXMLElement($xmlstr);
var_dump ($movies1 == $movies2); // false от PHP 5.2.0
?>

Резултатът от изпълнението на този пример:

Beispiel #8 Използване на XPath

SimpleXML включва вградена поддръжка на XPath. Търсете всички артикули :

включва "example.php" ;

$movies = нов SimpleXMLElement($xmlstr);

foreach ($movies -> xpath("//character" ) като $character ) (
echo $character -> name , " plays " , $character -> actor , PHP_EOL ;
}
?>

"// " служи като заместващ знак. За да посочите абсолютен път, пропуснете една от наклонените черти.

Резултатът от изпълнението на този пример:

Госпожица. Кодер играе ролята на Onlivia Actora Mr. Кодер играе от El ActÓr

Пример #9 Задаване на стойности

Данните в SimpleXML не трябва да бъдат неизменни. Обектът ви позволява да манипулирате всички елементи.

включва "example.php" ;
$movies = нов SimpleXMLElement($xmlstr);

$movies -> филм [ 0 ]-> символи -> символ [ 0 ]-> name = "Miss Coder" ;

echo $movies -> asXML();
?>

Резултатът от изпълнението на този пример:

PHP: Появява се анализаторът госпожице Кодер Онливия Актора Г-н. кодер El ActÓr 7 5

Пример #10 Добавяне на елементи и атрибути

От PHP 5.1.3 SimpleXML има способността лесно да добавя дъщерни елементи и атрибути.

включва "example.php" ;
$movies = нов SimpleXMLElement($xmlstr);

$character = $movies -> филм [ 0 ]-> символи -> addChild("character");
$character -> addChild("name" , "Mr. Parser" );
$character -> addChild("actor" , "John Doe" );

$rating = $movies -> movie [ 0 ]-> addChild("rating" , "PG" );
$rating -> addAttribute ("type" , "mpaa" );

echo $movies -> asXML();
?>

Резултатът от изпълнението на този пример:

PHP: Появява се анализаторът Госпожица. кодер Онливия Актора Г-н. кодер El ActÓr Г-н. анализаторДжон Доу Следователно това е език. Все още е език за програмиране. Или това е скриптов език? Всичко е разкрито в този документален филм, който прилича на филм на ужасите. PHP решава всичките ми проблеми в мрежата 7 5 PG

Beispiel #11 Взаимодействие с DOM

PHP може да конвертира XML възли от SimpleXML в DOM формат и обратно. Този пример показва как можете да модифицирате DOM елемент в SimpleXML.

$dom = нов DOMDocument;
$dom -> loadXML( "глупости" );
ако (! $dom ) (
ехо „Грешка при анализа на документа“;
изход;
}

$books = simplexml_import_dom($dom);

ехо $books -> книга [ 0 ]-> заглавие ;
?>

Резултатът от изпълнението на този пример:

преди 4 години

Често се предлага често срещан "трик" за преобразуване на SimpleXML обект в масив, като се изпълнява чрез json_encode() и след това json_decode(). Бих искал да обясня защо това е лоша идея.

Най-просто, защото целта на SimpleXML е да бъде по-лесен за използване и по-мощен от обикновен масив. Например, можете да пишетеbar -> baz [ "bing" ] ?> и означава същото катоbar [ 0 ]-> baz [ 0 ][ "bing" ] ?> , независимо колко bar или baz елементи има в XML; и ако пишетеbar [ 0 ]-> baz [ 0 ] ?> получавате цялото низово съдържание на този възел - включително CDATA секции - независимо дали той също има дъщерни елементи или атрибути. Освен това имате достъп до информация за пространството от имена, възможността да правите прости редакции на XML и дори възможността да „импортирате“ в DOM обект за много по-мощна манипулация. Всичко това се губи чрез превръщане на обекта в масив, вместо да се чете, разбирайки примерите на тази страница.

Освен това, тъй като не е проектиран за тази цел, преобразуването в JSON и обратно всъщност ще загуби информация в някои ситуации. Например, всички елементи или атрибути в пространство от имена просто ще бъдат отхвърлени и всяко текстово съдържание ще бъде отхвърлено, ако елементът също има дъщерни или атрибути. Понякога това няма да има значение, но ако придобиете навика да преобразувате всичко в масиви, това в крайна сметка ще ви ужили.

Разбира се, бихте могли да напишете по-интелигентно преобразуване, което нямаше тези ограничения, но в този момент не получавате никаква стойност от SimpleXML и трябва просто да използвате функциите на XML Parser от по-ниско ниво или класа XMLReader, Все още няма да имате допълнителната удобна функционалност на SimpleXML, но това е вашата загуба.

Преди 2 години

Ако вашият xml низ съдържа булеви числа, кодирани с "0" и "1", ще срещнете проблеми, когато прехвърляте елемента директно към bool:

$xmlstr =<<

1
0

XML
$values ​​= нов SimpleXMLElement($xmlstr);
$truevalue = (bool)$values->truevalue; // вярно
$falsevalue = (bool)$values->falsevalue; // също вярно!!!

Вместо първо трябва да прехвърляте към низ или int:

$truevalue = (bool)(int)$values->truevalue; // вярно
$falsevalue = (bool)(int)$values->falsevalue; // невярно

преди 9 години

Ако трябва да изведете валиден xml в отговора си, не забравяйте да зададете типа на съдържанието на заглавката си на xml в допълнение към извеждането на резултата от asXML():

$xml = simplexml_load_file("...");
...
... xml неща
...

// изведете xml във вашия отговор:
header("Тип на съдържанието: текст/xml");
ехо $xml -> asXML();
?>

преди 9 години

От файла README:

SimpleXML е предназначен да бъде лесен начин за достъп до XML данни.

SimpleXML обекти следват четири основни правила:

1) свойствата означават итератори на елементи
2) числови индекси означават елементи
3) нечисловите индекси означават атрибути
4) преобразуването на низове позволява достъп до TEXT данни

Когато итерирате свойства, разширението винаги повтаря
всички възли с това име на елемент. Така метод children() трябва да бъде
извикани за повторение на подвъзли. Но също така прави следното:
foreach ($obj->node_name като $elem) (
// направи нещо с $elem
}
винаги води до итерация на елементите "node_name". Така че не повече
проверка е необходима, за да се разграничи броят на възлите от този тип.

Когато се осъществява достъп до данни TEXT чрез свойство
тогава резултатът не включва ТЕКСТовите данни на поделементите.

Вече известни проблеми
============

Поради проблеми с двигателя в момента не е възможен достъп
поделемент с индекс 0: $object->property.

преди 8 години

Използването на неща като: is_object($xml->module->admin) за проверка дали всъщност има възел, наречен "admin", изглежда не работи както се очаква, тъй като simplexml винаги връща обект - в този случай празен - дори ако конкретен възел не съществува.
За мен добрата стара функция empty() изглежда работи добре в такива случаи.

преди 8 години

Бърз съвет за xpath заявките и пространствата от имена по подразбиране. Изглежда, че XML-системата зад SimpleXML има същата работа, както вярвам, че използва XML-системата .NET: когато човек трябва да адресира нещо в пространството от имена по подразбиране, ще трябва да декларира пространството от имена, използвайки registerXPathNamespace и след това да използва неговия префикс за адресирайте иначе в живия елемент на пространството от имена по подразбиране.

$string =<<

Четиридесет какво?
Джо
Джейн

Знам, че това е отговорът - но какъв е въпросът?




XML

$xml = simplexml_load_string ($string);
$xml -> registerXPathNamespace("def" , "http://www.w3.org/2005/Atom");

$nodes = $xml -> xpath("//def:document/def:title");

?>

преди 9 години

Докато SimpleXMLElement твърди, че е итерируем, изглежда не изпълнява стандартните функции на интерфейса на Iterator като::next и::reset правилно. Следователно, докато foreach() работи, функции като next(), current() или every() изглежда не работят както бихте очаквали - показалецът никога не изглежда да се движи или продължава да се нулира.

преди 6 години

Ако кодирането на XML документа е различно от UTF-8, декларацията за кодиране трябва да дойде веднага след version="..." и преди standalone="...". Това е изискване на XML стандарта.

Ако кодирането на XML-документа се различава от UTF-8. Декларацията за кодиране трябва да следва непосредствено след версия = "..." и преди самостоятелна = "...". Това изискване е стандартен XML.


Добре

Руски език. английски език


Фатална грешка: Неуловено изключение "Изключение" със съобщение "Стрингът не може да бъде анализиран като XML" в...

Extensible Markup Language XML е набор от правила за кодиране на документи в машинно четим вид. XML е популярен формат за обмен на данни в Интернет. Сайтове, които често актуализират съдържанието си, като новинарски сайтове или блогове, често предоставят XML канал, така че външните програми да са наясно с промените в съдържанието. Изпращането и анализирането на XML данни е често срещана задача за приложения с мрежова връзка. Този урок обяснява как да анализирате XML документи и да използвате техните данни.

Избор на анализатор

Анализ на канала

Първата стъпка в анализа на емисия е да решите кои полета с данни ви интересуват. Парсерът извлича дадените полета и игнорира всичко останало.

Ето фрагмента на канала, който ще бъде анализиран в примерното приложение. Всяка публикация в StackOverflow.com се появява в емисията като етикет за въвеждане, който съдържа няколко вложени маркера:

най-новите въпроси с етикет android - Stack Overflow ... ... http://stackoverflow.com/q/9439999 0 Къде е моят файл с данни? cliff2310 http://stackoverflow.com/users/1128925 2012-02-25T00:30:54Z 2012-02-25T00:30:54Z

Имам приложение, което изисква файл с данни...

... ...

Примерното приложение извлича данни от етикета за въвеждане и неговите подтагове заглавие, връзка и резюме.

Създаване на екземпляр на анализатора

Следващата стъпка е да създадете инстанция на анализатора и да стартирате процеса на синтактичен анализ. В този фрагмент анализаторът е инициализиран да не обработва пространства от имена и също така да използва предоставения InputStream като вход. Процесът на синтактичен анализ започва с извикване на nextTag() и извиква метода readFeed(), който извлича и обработва данните, от които приложението се интересува:

Публичен клас StackOverflowXmlParser ( // Ние не използваме пространства от имена private static final String ns = null; публичен парсинг на списък (InputStream in) хвърля XmlPullParserException, IOException ( опитайте ( XmlPullParser parser = Xml.newPullParser(); parser.XmPullParser(); parser.XmPullParser(); parser.XmPullParser(); parser.XmFACEPARSEll (SetSetPullParser) , false); parser.setInput(in, null); parser.nextTag(); връщане readFeed(parser); ) накрая ( in.close(); ) ) ... )

извадете канал

Методът readFeed() върши действителната работа по обработката на емисия. Елементите, маркирани с тага "entry", са отправната точка за рекурсивна обработка на канала. Ако следващият таг не е таг за въвеждане, той се пропуска. След като цялата "емисия" бъде обработена рекурсивно, readFeed() връща списък, съдържащ записите (включително вложени елементи от данни), които са извлечени от канала. След това този списък се връща от анализатора.

Private List readFeed(XmlPullParser parser) хвърля XmlPullParserException, IOException ( List entries = new ArrayList (); parser.require(XmlPullParser.START_TAG, ns, "feed"); while (parser.next() != XmlPull)Par (if.END_TAG)Parser (); (parser.getEventType() != XmlPullParser.START_TAG) (продължи;) Име на низ = parser.getName(); // Започва с търсене на етикет за въвеждане if (name.equals("entry")) ( entries.add( readEntry(parser)); ) else (пропускане(парсер); ) ) връщане на записи; )

Разбор на XML

Стъпките за анализиране на XML емисия са както следва:

Този фрагмент показва как синтактичен анализатор анализира запис, заглавие, връзка и резюме.

Публичен статичен клас Entry ( публичен окончателен низ заглавие; публична последна низова връзка; публичен окончателен низ обобщение; частен запис (заглавие на низ, обобщение на низ, връзка на низ) ( this.title = заглавие; this.summary = summary; this.link = връзка ; ) ) // Анализира съдържанието на запис. Ако срещне етикет за заглавие, резюме или връзка, предайте ги // на съответните им методи за "четене" за обработка. В противен случай пропуснете етикета. private Entry readEntry(XmlPullParser parser) хвърля XmlPullParserException, IOException ( parser.require(XmlPullParser.START_TAG, ns, "entry"); String title = null; String summary = null; String link = null; while (parser)! = XmlPullParser.END_TAG) ( if (parser.getEventType() != XmlPullParser.START_TAG) (продължи; ) Име на низ = parser.getName(); if (name.equals("title")) ( title = readTitle(parser) ; ) else if (name.equals("summary")) ( summary = readSummary(parser); ) else if (name.equals("link")) (link = readLink(parser); ) else ( skip(parser) ; ) ) връщане на нов запис(заглавие, резюме, връзка); ) // Обработва етикетите за заглавие в емисията. private String readTitle(XmlPullParser parser) хвърля IOException, XmlPullParserException ( parser.require(XmlPullParser.START_TAG, ns, "title"); String title = readText(parser); parser.require(XmlPullParser,END_ti); връщане на заглавие; ) // Обработва етикети за връзки в емисията. private String readLink(XmlPullParser parser) хвърля IOException, XmlPullParserException ( String link = ""; parser.require(XmlPullParser.START_TAG, ns, "link"); String tag = parser.getName(); String relTypetribut = parser.getAt(nu parser.getAt); , "rel"); if (tag.equals("link")) ( if (relType.equals("alternate"))(link = parser.getAttributeValue(null, "href"); parser.nextTag(); ) ) parser.require(XmlPullParser.END_TAG, ns, "link"); return link; ) // Обработва обобщени тагове в емисията. private String readSummary(XmlPullParser parser) хвърля IOException, XmlPullParserException ( parser.require(XmlPullParser.START_TAG, ns, "summary"); String summary = readText(parser); parser.require(XmlPullParser, "); parser.require(XmlPullParser, "); return summary; ) // За таговете title и summary, извлича техните текстови стойности. private String readText(XmlPullParser parser) хвърля IOException, XmlPullParserException ( String result = ""; if (parser.next() == XmlPullParser.TEXT) ( result = parser.getText(); parser.nextTag(); ) връща резултат; ) ...)

Пропуснете елементите, от които не се нуждаете

В една от стъпките за анализ на XML, описани по-горе, анализаторът пропуска тагове, които не ни интересуват. По-долу е кодът на анализатора за метода skip():

Private void skip(XmlPullParser parser) хвърля XmlPullParserException, IOException ( if (parser.getEventType() != XmlPullParser.START_TAG) ( throw new IllegalStateException(); ) int дълбочина = 1; while (дълбочина 0) ( switchparser 0) ( switchparser 0) next()) ( case XmlPullParser.END_TAG: дълбочина--; прекъсване; case XmlPullParser.START_TAG: дълбочина++; прекъсване; ) ) )

Ето как работи:

  • Методът хвърля изключение, ако текущото събитие не е START_TAG.
  • Той консумира START_TAG и всички събития до END_TAG.
  • За да се увери, че спира на правилния END_TAG, а не на първия маркер, който среща след оригиналния START_TAG, той следи дълбочината на влагане.

По този начин, ако текущият елемент има вложени елементи, дълбочината няма да бъде 0, докато анализаторът не обработи всички събития между оригиналния START_TAG и съответния му END_TAG. Например, помислете как анализаторът прескача елемент, който има 2 вложени елемента, и :

  • При първото преминаване през цикъла while, следващият таг, който анализаторът среща след това е START_TAG за
  • При второто преминаване през цикъла while следващият маркер, който анализаторът среща, е END_TAG
  • При третото преминаване през цикъла while, следващият маркер, който анализаторът среща, е START_TAG . Стойността на дълбочината се увеличава на 2.
  • При четвъртото преминаване през цикъла while следващият маркер, който анализаторът среща, е END_TAG. Стойността на дълбочината се намалява до 1.
  • При петото и последно преминаване през цикъла while, следващият маркер, който анализаторът среща, е END_TAG. Стойността на дълбочината намалява до 0, което показва, че елементът беше успешно пропуснат.

Обработка на XML данни

Примерното приложение получава и анализира XML канала в AsyncTask. Обработката се извършва извън основната нишка на потребителския интерфейс. Когато обработката приключи, приложението актуализира потребителския интерфейс в основната дейност (NetworkActivity).

Във фрагмента по-долу методът loadPage() прави следното:

  • Инициализира низова променлива със стойност на URL адрес, насочваща към XML емисия.
  • Извиква new DownloadXmlTask().execute(url), ако настройките на потребителя и мрежовата връзка позволяват. Това създава нов обект DownloadXmlTask ​​(подклас AsyncTask) и изпълнява неговия метод execute(), който изтегля и анализира емисията и връща резултат от низ, който да се покаже в потребителския интерфейс.
публичен клас NetworkActivity разширява активността ( публичен статичен краен низ WIFI = "Wi-Fi"; публичен статичен краен низ ANY = "Any"; частен статичен краен низ URL = "http://stackoverflow.com/feeds/tag?tagnames=android&sort =newest"; // Дали има Wi-Fi връзка. private static boolean wifiConnected = false; // дали има мобилна връзка. private static boolean mobileConnected = false; // дали дисплеят трябва да се опресни. public static boolean refreshDisplay = true; публичен статичен String sPref = null; ... // Използва AsyncTask за изтегляне на XML емисия от stackoverflow.com. public void loadPage() ( if((sPref. equals(ANY)) && (wifiConnected || mobileConnected )) ( нов DownloadXmlTask().execute(URL); ) else if ((sPref.equals(WIFI)) && (wifiConnected)) ( нов DownloadXmlTask().execute(URL); ) else ( // показване на грешка ) )
  • doInBackground() изпълнява метода loadXmlFromNetwork(). Той предава URL адреса на канала като параметър. Методът loadXmlFromNetwork() получава и обработва канала. Когато завърши обработката, той изпраща обратно получения низ.
  • onPostExecute() приема върнатия низ и го показва в потребителския интерфейс.
// Внедряване на AsyncTask, използвано за изтегляне на XML емисия от stackoverflow.com. частен клас DownloadXmlTask ​​разширява AsyncTask ( @Override protected String doInBackground(String... urls) ( опитайте ( връщане loadXmlFromNetwork(urls); ) catch (IOException e) ( return getResources().getString(R.string.connection_error); ) catch (XmlPullParserException e) ( return getResources().getString(R.string.xml_error); ) ) @Override protected void onPostExecute(String result) ( setContentView(R.layout.main); // Показва HTML низа в потребителския интерфейс чрез WebView WebView myWebView = (WebView) findViewById(R.id.webview); myWebView.loadData(резултат, "text/html", null); ) )

По-долу е методът loadXmlFromNetwork(), който се извиква от DownloadXmlTask. Той прави следното:

  1. Създава екземпляр на StackOverflowXmlParser. Той също така създава променливи за обектите List Entry и title, url и summary, за да съхранява стойностите, извлечени от XML канала за тези полета.
  2. Извиква downloadUrl() , който изтегля канала и го връща като InputStream.
  3. Използва StackOverflowXmlParser за синтактичен анализ на InputStream. StackOverflowXmlParser попълва записите в списъка с данните от емисията.
  4. Обработва списъка с записи и комбинира данните от емисията с HTML маркирането.
  5. Връща HTML низ, който се показва в потребителския интерфейс на основната дейност, AsyncTask в метода onPostExecute().
// Качва XML от stackoverflow.com, анализира го и го комбинира с // HTML маркиране. Връща HTML низ. private String loadXmlFromNetwork(String urlString) хвърля XmlPullParserException, IOException ( InputStream stream = null; // Инстанциране на анализатора StackOverflowXmlParser stackOverflowXmlParser = new StackOverflowXmlParser(); записи = нула; Заглавие на низ = нула; Низ url = нула; Резюме на низ = null; Calendar rightNow = Calendar.getInstance(); DateFormat formatter = new SimpleDateFormat("MMM dd h:mmaa"); // Проверява дали потребителят е задал предпочитанието да включва обобщен текст SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this); boolean pref = sharedPrefs.getBoolean("summaryPref", false); StringBuilder htmlString = нов StringBuilder(); htmlString.append("

" + getResources().getString(R.string.page_title) + "

"); htmlString.append(" " + getResources().getString(R.string.updated) + " " + formatter.format(rightNow.getTime()) + ""); опитайте ( stream = downloadUrl(urlString); entries = stackOverflowXmlParser.parse(stream); // Уверете се, че InputStream е затворен, след като приложението // приключи с използването му. ) накрая ( if (stream != null) ( stream.close(); ) ) // StackOverflowXmlParser връща списък (наречен "entries") с обекти Entry. // Всеки обект Entry представлява една публикация в XML емисията. // Този раздел обработва списъка с записи, за да комбинира всеки запис с HTML маркиране. // Всеки запис се показва в потребителския интерфейс като връзка, която по избор включва // текстово резюме. for (Entry entry: entries) ( htmlString. append("

" + entry.title + "

"); // Ако потребителят зададе предпочитанието да включва обобщен текст, // го добавя към дисплея. if (pref) ( htmlString.append(entry.summary); ) ) return htmlString.toString(); ) // Като се има предвид низово представяне на URL, установява връзка и получава // входен поток.private InputStream downloadUrl(String urlString) хвърля IOException (URL url = нов URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection() ; conn.setReadTimeout(10000 /* милисекунди */); conn.setConnectTimeout(15000 /* милисекунди */); conn.setRequestMethod("GET"); conn.setDoInput(true); // Стартира заявката conn.connect( ); връщане на conn.getInputStream(); )