Pangunahing paggamit ng SimpleXML. Pag-parse ng XML Data Halimbawa #5 Paggamit ng Mga Katangian

Pangunahing paggamit ng SimpleXML. Pag-parse ng XML Data Halimbawa #5 Paggamit ng Mga Katangian

Ngayon ay pag-aaralan natin ang pagtatrabaho sa XML.

Ang XML ay isang format para sa pagpapalitan ng data sa pagitan ng mga site.

Ito ay halos kapareho sa HTML, ngunit pinapayagan ng XML ang sarili nitong mga tag at katangian.

Bakit kailangan ang XML para sa pag-parse? Minsan nangyayari na ang site na kailangan mong i-parse ay may isang API kung saan maaari mong makuha ang gusto mo nang walang labis na pagsisikap.

Samakatuwid, isang payo lamang - bago i-parse ang isang site, suriin kung mayroon itong API.

Ano ang isang API? Ito ay isang hanay ng mga function kung saan maaari kang magpadala ng kahilingan sa site na ito at matanggap ang nais na tugon. Ang sagot na ito ay kadalasang nasa XML na format. Kaya simulan na natin itong pag-aralan.:

Paggawa gamit ang XML sa PHP Sabihin nating mayroon kang XML. Maaari itong nasa isang string, o naka-imbak sa isang file, o ibalik kapag hiniling sa isang partikular na URL. 25 1000 Hayaang maimbak ang XML sa isang string. Sa kasong ito, kailangan mong lumikha ng isang bagay mula sa string na ito gamit

bagong SimpleXMLElement $str = " Kolya

"; $xml = bagong SimpleXMLElement($str); Ngayon ay mayroon tayo sa variable$xml $str = ":

Sabihin nating mayroon kang XML. Maaari itong nasa isang string, o naka-imbak sa isang file, o ibalik kapag hiniling sa isang partikular na URL. 25 1000

isang bagay na may na-parse na XML ay nakaimbak. Sa pamamagitan ng pag-access sa mga katangian ng bagay na ito, maaari mong ma-access ang mga nilalaman ng mga XML tag. Titingnan natin kung paano eksakto sa ibaba.

Kung ang XML ay naka-imbak sa isang file o ipinadala sa pamamagitan ng pag-access sa isang URL (na kadalasang nangyayari), dapat mong gamitin ang function

simplexml_load_file

, na gumagawa ng parehong bagay

Sabihin nating mayroon kang XML. Maaari itong nasa isang string, o naka-imbak sa isang file, o ibalik kapag hiniling sa isang partikular na URL. 25 1000

$xml = simplexml_load_file(path sa file o URL);

Mga pamamaraan ng pagtatrabaho

Sa mga halimbawa sa ibaba, ang aming XML ay nakaimbak sa isang file o URL.

Hayaang ibigay ang sumusunod na XML: Kunin natin ang pangalan, edad at suweldo ng empleyado: $xml = simplexml_load_file(path sa file o URL); echo $xml->pangalan; //ay ipapakita ang "Kolya" echo $xml->age; //mag-iimprenta ng 25 echo $xml->salary; //maglalabas ng 1000

Sabihin nating mayroon kang XML. Maaari itong nasa isang string, o naka-imbak sa isang file, o ibalik kapag hiniling sa isang partikular na URL. 25 1000

Mga pamamaraan ng pagtatrabaho

Tulad ng nakikita mo, ang bagay na $xml ay may mga katangian na naaayon sa mga tag. sa simpleng HTML.

Baguhin natin nang kaunti ang ating XML:

Sabihin nating mayroon kang XML. Maaari itong nasa isang string, o naka-imbak sa isang file, o ibalik kapag hiniling sa isang partikular na URL. 25 1000

Sa kasong ito, makakakuha kami ng isang hanay ng mga kahilingan:

$xml = simplexml_load_file(path sa file o URL); echo $xml->manggagawa->pangalan; //ay ipapakita ang "Kolya" echo $xml->worker->age; //maglalabas ng 25 echo $xml->worker->sweldo; //maglalabas ng 1000

Paggawa gamit ang mga katangian

Hayaang maimbak ang ilang data sa mga katangian:

Numero 1

$xml = simplexml_load_file(path sa file o URL); echo $xml->manggagawa["pangalan"]; //ay ipapakita ang "Kolya" echo $xml->manggagawa["edad"]; //maglalabas ng 25 echo $xml->manggagawa["suweldo"]; //maglalabas ng 1000 echo $xml->manggagawa; //ay ipapakita ang "Number 1"

Mga tag na may mga gitling

Binibigyang-daan ng XML ang mga tag (at attribute) na may gitling. Sa kasong ito, ang pag-access sa mga naturang tag ay nangyayari tulad nito:

Sabihin nating mayroon kang XML. Maaari itong nasa isang string, o naka-imbak sa isang file, o ibalik kapag hiniling sa isang partikular na URL. Ivanov

$xml = simplexml_load_file(path sa file o URL); echo $xml->manggagawa->(pangalan); //ay ipapakita ang "Kolya" echo $xml->worker->(apelyido); // ay magpapakita ng "Ivanov"

Looping

Magkaroon tayo ngayon ng hindi isang empleyado, ngunit marami.

Sabihin nating mayroon kang XML. Maaari itong nasa isang string, o naka-imbak sa isang file, o ibalik kapag hiniling sa isang partikular na URL. 25 1000 Sa kasong ito, maaari tayong umulit sa ating object gamit ang foreach loop: 26 2000 Vasya 27 3000

Petya

$xml = simplexml_load_file(path sa file o URL); foreach ($xml bilang $manggagawa) ( echo $worker->name; // ay magpapakita ng "Kolya", "Vasya", "Petya")

Mula sa bagay hanggang sa normal na hanay

Kung hindi ka komportable na magtrabaho kasama ang bagay, maaari mo itong i-convert sa isang normal na array ng PHP gamit ang sumusunod na trick:

$xml = simplexml_load_file(path sa file o URL); var_dump(json_decode(json_encode($xml), true));

Higit pang impormasyon

Pag-parse batay sa sitemap.xml

Kadalasan ang isang site ay may sitemap.xml file.

Ang file na ito ay nag-iimbak ng mga link sa lahat ng mga pahina ng site para sa kadalian ng pag-index ng mga search engine (ang pag-index ay mahalagang pag-parse ng site ng Yandex at Google).

Sa pangkalahatan, hindi tayo dapat mag-alala kung bakit kailangan ang file na ito, ang pangunahing bagay ay kung mayroon ito, hindi mo kailangang mag-crawl sa mga pahina ng site gamit ang anumang nakakalito na pamamaraan, ngunit gamitin lamang ang file na ito.

Paano suriin ang pagkakaroon ng file na ito: i-parse natin ang site na site.ru, pagkatapos ay pumunta sa site.ru/sitemap.xml sa browser - kung nakakita ka ng isang bagay, pagkatapos ay naroroon ito, at kung hindi mo ito nakikita, tapos sayang.

Kung mayroong isang sitemap, naglalaman ito ng mga link sa lahat ng mga pahina ng site sa XML na format. Kalmadong kunin ang XML na ito, i-parse ito, paghiwalayin ang mga link sa mga pahinang kailangan mo sa anumang paraan na maginhawa para sa iyo (halimbawa, sa pamamagitan ng pagsusuri sa URL, na inilarawan sa paraan ng spider).

Bilang resulta, makakakuha ka ng isang listahan ng mga link para sa pag-parse; ang kailangan mo lang gawin ay pumunta sa kanila at i-parse ang nilalaman na kailangan mo.

Simulan ang paglutas ng mga problema gamit ang sumusunod na link: mga problema para sa aralin.

Kapag napagpasyahan mo ang lahat, magpatuloy sa pag-aaral ng bagong paksa.

Ang XML parsing ay mahalagang nangangahulugang paglalakad sa isang XML na dokumento at pagbabalik ng kaukulang data. Habang dumaraming bilang ng mga serbisyo sa web ang nagbabalik ng data sa format na JSON, karamihan ay gumagamit pa rin ng XML, kaya mahalagang master ang XML parsing kung gusto mong gamitin ang buong hanay ng mga available na API.

Gamit ang extension SimpleXML sa PHP, na idinagdag pabalik sa PHP 5.0, ang pagtatrabaho sa XML ay napakadali at simple. Sa artikulong ito ipapakita ko sa iyo kung paano ito gagawin.

Mga pangunahing kaalaman sa paggamit

Magsimula tayo sa sumusunod na halimbawa languages.xml:


>

> 1972>
> Dennis Ritchie >
>

> 1995>
> Rasmus Lerdorf >
>

> 1995>
> James Gosling >
>
>

Ang XML na dokumentong ito ay naglalaman ng isang listahan ng mga programming language na may ilang impormasyon tungkol sa bawat wika: ang taon na ito ay ipinakilala at ang pangalan ng lumikha nito.

Ang unang hakbang ay i-load ang XML gamit ang alinman sa mga function simplexml_load_file(), o simplexml_load_string(). Tulad ng iminumungkahi ng pangalan ng mga function, ang una ay maglo-load ng XML mula sa isang file, at ang pangalawa ay maglo-load ng XML mula sa isang string.

Binabasa ng parehong mga function ang buong puno ng DOM sa memorya at nagbabalik ng isang bagay SimpleXMLElement. Sa halimbawa sa itaas, ang bagay ay nakaimbak sa $languages ​​​​variable. Maaari mong gamitin ang mga function var_dump() o print_r() upang makakuha ng mga detalye tungkol sa ibinalik na bagay kung gusto mo.

SimpleXMLElement Object
[lang] => Array
[ 0 ] => SimpleXMLElement Object
[@attributes] => Array
[pangalan] => C
[lumitaw] => 1972
[tagalikha] => Dennis Ritchie
[ 1 ] => SimpleXMLElement Object
[@attributes] => Array
[pangalan] => PHP
[lumitaw] => 1995
[tagalikha] => Rasmus Lerdorf
[ 2 ] => SimpleXMLElement Object
[@attributes] => Array
[pangalan] => Java
[lumitaw] => 1995
[tagalikha] => James Gosling
)
)

Naglalaman ang XML na ito ng root element mga wika, sa loob kung saan mayroong tatlong elemento lang. Ang bawat elemento ng array ay tumutugma sa isang elemento lang sa XML na dokumento.

Maaari mong ma-access ang mga katangian ng isang bagay gamit ang operator -> . Halimbawa, ibabalik sa iyo ng $languages->lang ang isang SimpleXMLElement object na tumutugma sa unang elemento lang. Ang bagay na ito ay naglalaman ng dalawang katangian: lumitaw at tagalikha.

$languages ​​​​-> lang [ 0 ] -> lumitaw ;
$languages ​​​​-> lang [ 0 ] -> creator ;

Ang pagpapakita ng isang listahan ng mga wika at pagpapakita ng kanilang mga katangian ay maaaring gawin nang napakadali gamit ang isang karaniwang loop tulad ng foreach.

foreach ($languages ​​​​-> lang as $lang ) (
printf(
"" ,
$lang ["pangalan" ],
$lang -> lumitaw ,
$lang -> creator
) ;
}

Pansinin kung paano ko na-access ang pangalan ng lang attribute ng elemento para makuha ang pangalan ng wika. Sa ganitong paraan maaari mong ma-access ang anumang katangian ng isang elemento na kinakatawan bilang isang bagay na SimpleXMLElement.

Nagtatrabaho sa Namespaces

Habang nagtatrabaho sa XML ng iba't ibang serbisyo sa web, makakatagpo ka ng mga namespace ng elemento nang higit sa isang beses. Baguhin natin ang ating languages.xml para magpakita ng halimbawa ng paggamit ng namespace:



xmlns:dc =>

> 1972>
> Dennis Ritchie >
>

> 1995>
> Rasmus Lerdorf >
>

> 1995>
> James Gosling >
>
>

Ngayon ang elemento manlilikha akma sa namespace dc na tumuturo sa http://purl.org/dc/elements/1.1/. Kung susubukan mong i-print ang mga tagalikha ng wika gamit ang aming nakaraang code, hindi ito gagana. Upang mabasa ang mga namespace ng elemento kailangan mong gumamit ng isa sa mga sumusunod na diskarte.

Ang unang diskarte ay ang paggamit ng mga pangalan ng URI nang direkta sa code kapag ina-access ang namespace ng elemento. Ang sumusunod na halimbawa ay nagpapakita kung paano ito ginagawa:

$dc = $languages ​​​​-> lang [ 1 ] -> mga bata( "http://purl.org/dc/elements/1.1/") ;
echo $dc -> creator ;

Pamamaraan mga bata() kumukuha ng namespace at nagbabalik ng mga child element na nagsisimula sa prefix. Kailangan ng dalawang argumento, ang una ay ang XML namespace, at ang pangalawa ay isang opsyonal na argumento na nagde-default sa hindi totoo. Kung ang pangalawang argumento ay nakatakda sa TRUE, ang namespace ay ituturing bilang isang prefix. Kung FALSE, ang namespace ay ituturing bilang isang URL namespace.

Ang pangalawang diskarte ay basahin ang mga pangalan ng URI mula sa dokumento at gamitin ang mga ito kapag ina-access ang namespace ng elemento. Ito ay talagang isang mas mahusay na paraan upang ma-access ang mga elemento dahil hindi mo kailangang i-hardcode sa URI.

$namespaces = $languages ​​​​-> getNamespaces (true) ;
$dc = $languages ​​​​-> lang [ 1 ] -> children ( ($namespaces [ "dc" ] );

echo $dc -> creator ;

Pamamaraan GetNamespaces() nagbabalik ng hanay ng mga pangalan ng prefix at mga nauugnay na URI ng mga ito. Tumatanggap ito ng karagdagang parameter na magiging default hindi totoo. Kung itinakda mo ito tulad ng totoo, pagkatapos ay ibabalik ng paraang ito ang mga pangalang ginamit sa mga node ng magulang at anak. Kung hindi, makikita nito ang mga namespace na ginagamit lamang sa parent node.

Ngayon ay maaari ka nang umulit sa listahan ng mga wika tulad nito:

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

foreach ($languages ​​​​-> lang as $lang ) (
$dc = $lang -> mga bata ($ns [ "dc" ] );
printf(
"

Lumitaw ang %s sa %d at ginawa ni %s .

" ,
$lang ["pangalan" ],
$lang -> lumitaw ,
$dc -> tagalikha
) ;
}

Praktikal na halimbawa - Pag-parse ng video channel mula sa YouTube

Tingnan natin ang isang halimbawa na nakakakuha ng RSS feed mula sa isang channel sa YouTube at nagpapakita ng mga link sa lahat ng mga video mula dito. Upang gawin ito, mangyaring makipag-ugnayan sa sumusunod na address:

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

Ang URL ay nagbabalik ng listahan ng mga pinakabagong video mula sa isang ibinigay na channel sa XML na format. Ipa-parse namin ang XML at kukunin ang sumusunod na impormasyon para sa bawat video:

  • Link ng video
  • Miniature
  • Pangalan

Magsisimula tayo sa paghahanap at pag-load ng XML:

$channel = "Channel_name" ;
$url = "http://gdata.youtube.com/feeds/api/users/". $channel. "/uploads" ;
$xml = file_get_contents($url);

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

Kung titingnan mo ang XML feed, makikita mo na mayroong ilang elemento doon nilalang, na ang bawat isa ay nag-iimbak ng detalyadong impormasyon tungkol sa isang partikular na video mula sa channel. Ngunit gumagamit lang kami ng mga thumbnail ng larawan, URL ng video at pamagat. Ang tatlong elementong ito ay mga inapo ng elemento pangkat, na siya namang anak ng pagpasok:

>

>



Pamagat… >

>

>

Dadaanan lang natin lahat ng elemento pagpasok, at para sa bawat isa sa kanila kukunin namin ang kinakailangang impormasyon. tandaan mo yan manlalaro thumbnail At pamagat ay nasa namespace ng media. Kaya, dapat tayong magpatuloy tulad ng sa nakaraang halimbawa. Kumuha kami ng mga pangalan mula sa dokumento at ginagamit ang namespace kapag nag-a-access ng mga elemento.

foreach ($feed -> entry bilang $entry ) (
$group = $entry -> mga bata ($ns [ "media" ] );
$group = $group -> group ;
$thumbnail_attrs = $group -> thumbnail [ 1 ] -> attributes () ;
$image = $thumbnail_attrs [ "url" ] ;
$player = $group -> player -> attributes () ;
$link = $player [ "url" ] ;
$title = $group -> title ;
printf( "

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

Konklusyon

Ngayong alam mo na kung paano gamitin SimpleXML Para sa pag-parse ng XML data, maaari mong pagbutihin ang iyong mga kasanayan sa pamamagitan ng pag-parse ng iba't ibang XML feed na may iba't ibang API. Ngunit mahalagang isaalang-alang na binabasa ng SimpleXML ang buong DOM sa memorya, kaya kung nag-parse ka ng malaking set ng data, maaari kang maubusan ng memorya. Upang matuto nang higit pa tungkol sa SimpleXML basahin ang dokumentasyon.


Kung mayroon kang anumang mga katanungan, inirerekomenda namin ang paggamit ng aming


ang paglalathala ng artikulong ito ay pinahihintulutan lamang na may link sa website ng may-akda ng artikulo

Sa artikulong ito ay magpapakita ako ng isang halimbawa kung paano i-parse ang isang malaking XML file. Kung ang iyong server (hosting) ay hindi nagbabawal sa pagtaas ng oras ng pagpapatakbo ng script, maaari mong i-parse ang isang XML file na tumitimbang ng hindi bababa sa gigabytes;

Kapag nag-parse ng malalaking XML file, dalawang problema ang lumitaw:
1. Hindi sapat ang memorya.
2. Walang sapat na inilaan na oras para tumakbo ang script.

Ang pangalawang problema sa oras ay maaaring malutas kung hindi ito ipagbabawal ng server.
Ngunit ang problema sa memorya ay mahirap lutasin, kahit na pinag-uusapan natin ang tungkol sa iyong sariling server, kung gayon ang paglipat ng mga file na 500 megabytes ay hindi napakadali, at hindi posible na madagdagan ang memorya sa pagho-host at VDS.

Ang PHP ay may ilang built-in na XML na opsyon sa pagpoproseso - SimpleXML, DOM, SAX.
Ang lahat ng mga opsyong ito ay inilalarawan nang detalyado sa maraming artikulo na may mga halimbawa, ngunit ang lahat ng mga halimbawa ay nagpapakita ng pagtatrabaho sa isang buong XML na dokumento.

Narito ang isang halimbawa, pagkuha ng isang bagay mula sa isang XML file

Ngayon ay maaari mong iproseso ang bagay na ito, PERO...
Tulad ng nakikita mo, ang buong XML file ay binabasa sa memorya, pagkatapos ang lahat ay na-parse sa isang bagay.
Iyon ay, ang lahat ng data ay napupunta sa memorya at kung walang sapat na inilalaan na memorya, ang script ay hihinto.

Ang pagpipiliang ito ay hindi angkop para sa pagpoproseso ng malalaking file, kailangan mong basahin ang file sa bawat linya at isa-isang iproseso ang data na ito.
Sa kasong ito, isinasagawa din ang pagsusuri ng validity habang pinoproseso ang data, kaya kailangan mong ma-rollback, halimbawa, tanggalin ang lahat ng data na ipinasok sa database sa kaso ng isang hindi wastong XML file, o magsagawa ng dalawang pass sa pamamagitan ng file, basahin muna para sa bisa, pagkatapos ay basahin para sa pagproseso ng data.

Narito ang isang teoretikal na halimbawa ng pag-parse ng isang malaking XML file.
Binabasa ng script na ito ang isang character sa isang pagkakataon mula sa isang file, kinokolekta ang data na ito sa mga bloke at ipinapadala ito sa XML parser.
Ang diskarte na ito ay ganap na malulutas ang problema sa memorya at hindi nagiging sanhi ng pagkarga, ngunit pinalala ang problema sa paglipas ng panahon. Paano subukang lutasin ang problema sa paglipas ng panahon, basahin sa ibaba.

Function webi_xml ($file)
{

########
### function ng data

{
i-print ang $data ;
}
############################################



{
i-print ang $pangalan ;
print_r($attrs);
}


## closing tag function
function na endElement ($parser, $name)
{
i-print ang $pangalan ;
}
############################################

($xml_parser, "data");

// buksan ang file
$fp = fopen($file, "r");

$perviy_vxod = 1 ; $data = "" ;



{

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


if($simvol != ">") ( continue;)


echo"

masira;
}

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

Webi_xml("1.xml");

?>

Sa halimbawang ito, inilalagay ko ang lahat sa isang function webi_xml() at sa pinakailalim makikita mo ang tawag nito.
Ang script mismo ay binubuo ng tatlong pangunahing pag-andar:
1. Isang function na nakakakuha ng pagbubukas ng startElement() tag
2. Isang function na kumukuha ng closing endElement() tag
3. At ang data na tumatanggap ng function na data() .

Ipagpalagay natin na ang mga nilalaman ng file 1.xml ay isang recipe



< title >Simpleng tinapay
< ingredient amount = "3" unit = "стакан" >harina
< ingredient amount = "0.25" unit = "грамм" >lebadura
< ingredient amount = "1.5" unit = "стакан" >Mainit na tubig
< ingredient amount = "1" unit = "чайная ложка" >asin
< instructions >
< step > Paghaluin ang lahat ng sangkap at masahin nang maigi.
< step > Takpan ng tela at mag-iwan ng isang oras sa isang mainit na silid..
< step > Masahin muli, ilagay sa isang baking sheet at ilagay sa oven.
< step > Bisitahin ang site site


Sinisimulan namin ang lahat sa pamamagitan ng pagtawag sa pangkalahatang function na webi_xml ("1.xml" );
Susunod, magsisimula ang parser sa function na ito at iko-convert ang lahat ng mga pangalan ng tag sa upper case upang ang lahat ng mga tag ay may parehong case.

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

Ngayon ay ipinapahiwatig namin kung aling mga function ang gagana upang mahuli ang pagbubukas ng isang tag, pagsasara at pagproseso ng data

xml_set_element_handler($xml_parser, "startElement", "endElement");
xml_set_character_data_handler($xml_parser, "data");

Susunod ay ang pagbubukas ng tinukoy na file, umuulit sa file nang paisa-isa at ang bawat karakter ay idinagdag sa string variable hanggang sa matagpuan ang karakter. > .
Kung ito ang pinakaunang pag-access sa file, kung gayon ang lahat ng hindi kailangan sa simula ng file ay tatanggalin, lahat ng nauna. , ito ang tag na dapat magsimula sa XML.
Sa unang pagkakataon, maglalaman ng string ang isang string variable

At ipadala ito sa disassembler
xml_parse ($xml_parser, $data, feof ($fp));
Pagkatapos iproseso ang data, ang string variable ay ni-reset at ang koleksyon ng data sa isang string ay magsisimula muli at ang string ay nabuo sa pangalawang pagkakataon

Sa pangatlo
</b><br>sa ikaapat <br><b>Simpleng tinapay

Pakitandaan na ang isang string variable ay palaging nabuo mula sa isang nakumpletong tag > at hindi kinakailangang magpadala sa magnanakaw ng bukas at saradong tag na may data, halimbawa
Simpleng tinapay
Mahalaga para sa handler na ito na makatanggap ng isang buong hindi naputol na tag, kahit isang bukas na tag, at sa susunod na hakbang isang closed tag, o agad na makatanggap ng 1000 linya ng isang file, hindi mahalaga, ang pangunahing bagay ay ang tag hindi masira, halimbawa

le>Plain bread
Sa ganitong paraan, imposibleng magpadala ng data sa handler, dahil napunit ang tag.
Maaari kang makabuo ng iyong sariling paraan ng pagpapadala ng data sa handler, halimbawa, mangolekta ng 1 megabyte ng data at ipadala ito sa handler upang mapabilis, siguraduhin lamang na ang mga tag ay palaging kumpleto at ang data ay maaaring mapunit
Simple</b><br><b>tinapay

Kaya, sa mga bahagi ayon sa gusto mo, maaari kang magpadala ng isang malaking file sa processor.

Ngayon tingnan natin kung paano pinoproseso ang data na ito at kung paano ito makukuha.

Magsimula tayo sa pambungad na tag function startElement ($parser, $name, $attrs)
Ipagpalagay natin na ang pagpoproseso ay umabot na sa linya
< ingredient amount = "3" unit = "стакан" >harina
Pagkatapos sa loob ng function ang variable na $name ay magiging katumbas ng sangkap ibig sabihin, ang pangalan ng bukas na tag (hindi pa ito sumasara sa tag).
Gayundin sa kasong ito, isang hanay ng mga katangian ng tag na ito na $attrs ay magiging available, na maglalaman ng data halaga = "3" at unit = "salamin".

Pagkatapos nito, ang data ng bukas na tag ay naproseso ng function data ($parser, $data)
Ang variable na $data ay maglalaman ng lahat ng nasa pagitan ng pambungad at pagsasara ng mga tag, sa aming kaso ito ang tekstong Muka

At ang pagproseso ng aming string sa pamamagitan ng function ay nagtatapos endElement ($parser, $name)
Ito ang pangalan ng closed tag, sa aming kaso $name ay magiging katumbas ng sangkap

At pagkatapos noon ang lahat ay naglibot muli.

Ang halimbawa sa itaas ay nagpapakita lamang ng prinsipyo ng pagpoproseso ng XML, ngunit para sa tunay na aplikasyon kailangan itong baguhin.
Karaniwan, kailangan mong i-parse ang malaking XML upang maipasok ang data sa database, at para maayos na maproseso ang data na kailangan mong malaman kung aling bukas na tag ang data kabilang, kung anong antas ng tag nesting, at kung aling mga tag ang bukas sa hierarchy sa itaas. Gamit ang impormasyong ito, maaari mong iproseso nang tama ang file nang walang anumang mga problema.
Para magawa ito, kailangan mong magpakilala ng ilang pandaigdigang variable na mangongolekta ng impormasyon tungkol sa mga bukas na tag, nesting at data.
Narito ang isang halimbawa na maaari mong gamitin

Function webi_xml ($file)
{
pandaigdigang $webi_depth ; // counter para subaybayan ang lalim ng nesting
$webi_depth = 0 ;
pandaigdigang $webi_tag_open ; // ay maglalaman ng hanay ng mga kasalukuyang bukas na tag
$webi_tag_open = array();
pandaigdigang $webi_data_temp ; // ang array na ito ay maglalaman ng data ng isang tag

####################################################
### function ng data
data ng function ($parser, $data)
{
global $webi_depth ;
pandaigdigang $webi_tag_open ;
pandaigdigang $webi_data_temp ;
// magdagdag ng data sa array na nagpapahiwatig ng nesting at kasalukuyang bukas na tag
$webi_data_temp [ $webi_depth ][ $webi_tag_open [ $webi_depth ]][ "data" ].= $data ;
}
############################################

####################################################
### opening tag function
function startElement ($parser, $name, $attrs)
{
global $webi_depth ;
pandaigdigang $webi_tag_open ;
pandaigdigang $webi_data_temp ;

// kung hindi na zero ang nesting level, bukas na ang isang tag
// at ang data mula dito ay nasa array na, maaari mo itong iproseso
kung ($webi_depth)
{




" ;

print"
" ;
print_r($webi_tag_open); // hanay ng mga bukas na tag
print"


" ;

// pagkatapos iproseso ang data, tanggalin ito upang magbakante ng memorya
unset($GLOBALS [ "webi_data_temp" ][ $webi_depth ]);
}

// ngayon ang susunod na tag ay binuksan at ang karagdagang pagproseso ay magaganap sa susunod na hakbang
$webi_depth++; // dagdagan ang pugad

$webi_tag_open [ $webi_depth ]= $name ; // magdagdag ng bukas na tag sa hanay ng impormasyon
$webi_data_temp [ $webi_depth ][ $name ][ "attrs" ]= $attrs ; // ngayon magdagdag ng mga katangian ng tag

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

#################################################
## closing tag function
function endElement ($parser, $name) (
global $webi_depth ;
pandaigdigang $webi_tag_open ;
pandaigdigang $webi_data_temp ;

// Nagsisimula ang pagproseso ng data dito, halimbawa pagdaragdag sa database, pag-save sa isang file, atbp.
// Ang $webi_tag_open ay naglalaman ng isang hanay ng mga bukas na tag ayon sa antas ng nesting
// halimbawa $webi_tag_open[$webi_depth] ay naglalaman ng pangalan ng bukas na tag na ang impormasyon ay kasalukuyang pinoproseso
// $webi_depth tag nesting level
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]["attrs"] hanay ng mga attribute ng tag
// $webi_data_temp[$webi_depth][$webi_tag_open[$webi_depth]]["data"] data ng tag

I-print ang "data" . $webi_tag_open [ $webi_depth ]. "--" .($webi_data_temp [ $webi_depth ][ $webi_tag_open [ $webi_depth ]][ "data" ]). "
" ;
print_r ($webi_data_temp [ $webi_depth ][ $webi_tag_open [ $webi_depth ]][ "attrs" ]);
print"
" ;
print_r($webi_tag_open);
print"


" ;

Unset($GLOBALS [ "webi_data_temp" ]); // pagkatapos iproseso ang data, tatanggalin namin ang buong array na may data, dahil sarado ang tag
unset($GLOBALS [ "webi_tag_open" ][ $webi_depth ]); // tanggalin ang impormasyon tungkol sa bukas na tag na ito... mula noong nagsara ito

$webi_depth --; // bawasan ang nesting
}
############################################

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

// ipahiwatig kung aling mga function ang gagana kapag binubuksan at isinasara ang mga tag
xml_set_element_handler($xml_parser, "startElement", "endElement");

// tukuyin ang isang function para sa pagtatrabaho sa data
xml_set_character_data_handler($xml_parser, "data");

// buksan ang file
$fp = fopen($file, "r");

$perviy_vxod = 1 ; // flag para suriin ang unang entry sa file
$data = "" ; // dito kinokolekta namin ang data mula sa file sa mga bahagi at ipadala ito sa xml parser

// loop hanggang sa dulo ng file ay matagpuan
habang (! feof ($fp ) at $fp )
{
$simvol = fgetc ($fp); // basahin ang isang character mula sa file
$data .= $simvol ; // idagdag ang character na ito sa data na ipapadala

// kung ang character ay hindi ang end tag, pagkatapos ay bumalik sa simula ng loop at magdagdag ng isa pang character sa data, at iba pa hanggang sa makita ang end tag
if($simvol != ">") ( continue;)
// kung natagpuan ang pansarang tag, ngayon ay ipapadala namin ang nakolektang data na ito para sa pagproseso

// suriin kung ito ang unang entry sa file, pagkatapos ay tatanggalin namin ang lahat na bago ang tag// dahil kung minsan ay maaaring may basura bago ang simula ng XML (mga clumsy na editor, o ang file ay natanggap ng isang script mula sa ibang server)
if($perviy_vxod ) ($data = strstr ($data , "

// ngayon itapon ang data sa xml parser
kung (! xml_parse ($xml_parser, $data, feof ($fp))) (

// dito maaari kang magproseso at makatanggap ng mga error sa validity...
// sa sandaling magkaroon ng error, hihinto ang pag-parse
echo"
XML Error: " . xml_error_string(xml_get_error_code($xml_parser));
echo "sa linya" . xml_get_current_line_number ($xml_parser);
masira;
}

// pagkatapos ng pag-parse, itapon ang nakolektang data para sa susunod na hakbang ng cycle.
$data = "" ;
}
fclose($fp);
xml_parser_free($xml_parser);
// pag-alis ng mga pandaigdigang variable
unset($GLOBALS [ "webi_depth" ]);
unset($GLOBALS [ "webi_tag_open" ]);
unset($GLOBALS [ "webi_data_temp" ]);

Webi_xml("1.xml");

?>

Ang buong halimbawa ay sinamahan ng mga komento, ngayon ay pagsubok at eksperimento.
Mangyaring tandaan na sa pag-andar ng pagtatrabaho sa data, ang data ay hindi lamang ipinasok sa isang array, ngunit sa halip ay idinagdag gamit ang " .=" dahil ang data ay maaaring hindi dumating sa kabuuan nito, at kung gagawa ka lamang ng isang takdang-aralin, pagkatapos ay pana-panahong matatanggap mo ang data sa mga tipak.

Well, iyon lang, ngayon ay may sapat na memorya kapag nagpoproseso ng isang file ng anumang laki, ngunit ang oras ng pagpapatakbo ng script ay maaaring tumaas sa maraming paraan.
Magpasok ng isang function sa simula ng script
set_time_limit(6000);
o
ini_set ("max_execution_time" , "6000" );

O magdagdag ng text sa .htaccess file
php_value max_execution_time 6000

Ang mga halimbawang ito ay magpapataas sa oras ng pagpapatakbo ng script sa 6000 segundo.
Maaari mong dagdagan ang oras sa ganitong paraan lamang kapag naka-off ang safe mode.

Kung mayroon kang access upang i-edit ang php.ini maaari mong dagdagan ang oras sa paggamit
max_execution_time = 6000

Halimbawa, sa Masterhost hosting, sa oras ng pagsulat ng artikulong ito, ang pagtaas ng oras ng script ay ipinagbabawal, sa kabila ng safe mode na naka-off, ngunit kung ikaw ay isang pro, maaari kang gumawa ng iyong sariling PHP build sa Masterhost, ngunit iyon ay wala sa artikulong ito.

Stage 1. Pagpasa sa pagsubok (pakikipag-ugnayan sa GIS GMP test circuit) #GIS GMP test service address:
gisgmp.wsdlLocation=http://213.59.255.182:7777/gateway/services/SID0003663?wsdl
gisgmp.wsdlLocation.endPoint=http://213.59.255.182:7777/gateway/services/SID0003663
Ang address na ito ay nakarehistro sa mga setting ng SP Bilang karagdagan, kailangan mong irehistro ito sa file ng mga setting ng pag-log, na tumutukoy sa halaga TRACE. Matapos ipasok ang tinukoy na mga halaga, kailangan mong simulan ang SP at ang ACC client (i-restart kung ito ay nailunsad na Susunod, mula sa ROR o sa Accounting Office/AU Application para sa pagbabayad ng mga pondo, kailangan mong gawin ang aksyon). "Gumawa ng Impormasyon sa Pagbabayad", kung naipasa ang mga kontrol ng system, malilikha ang Impormasyon tungkol sa pagbabayad. Na sa ibang pagkakataon ay kailangang i-unload.
Pagkatapos mag-upload, kailangan mong suriin ang status gamit ang pagkilos na "Humiling ng katayuan sa pagproseso." Pagkatapos nito ay lumipat ang ED na Impormasyon sa Pagbabayad sa katayuang "Tinanggap ng GIS GMP" -…

Ibinigay: MSG (message) table na may maraming mga entry.
CREATETABLEmsg(idINTEGERNOTNULLPRIMARYKEY,descriptionCHAR(50)NOTNULL, date_createDATE);
Gawain:
Kinakailangang i-clear ang talahanayan ng data/
Solusyon: Mayroong ilang mga paraan upang malutas ang problemang ito. Nasa ibaba ang isang paglalarawan at halimbawa ng bawat isa sa kanila.
Ang pinakamadaling paraan ( unang pagpipilian) - pagpapatupad ng operator ng pagtanggal ng tala. Kapag pinaandar mo ito, makikita mo ang resulta (kung gaano karaming mga tala ang tinanggal). Isang madaling gamiting bagay kapag kailangan mong malaman at maunawaan kung ang tamang data ay tinanggal. NGUNIT may mga disadvantages kumpara sa iba pang mga opsyon para sa paglutas ng problema.

DELETE FROMmsg;--Delete lahat ng row sa table --Tinatanggal ang lahat ng mga hilera na may petsa ng paglikha na "2019.02.01" DELETE FROMmsg WHEREdate_create="2019.02.01";

Pangalawang opsyon. Gamit ang DML statement para i-clear ang lahat ng row sa isang table.
TRUNCATETABLEmsg;
Mayroong ilang mga tampok ng paggamit ng operator na ito:
Wala ito sa Firebird, kaya ginagamit namin ang una at pangatlong opsyon Pagkatapos…

Mga kasalukuyang address para sa mga kahilingan sa SMEV 3.0 Ipinaaalala namin sa iyo na, alinsunod sa naunang na-publish na impormasyon sa SMEV 3.0 Technology Portal, kinakailangang gamitin ang kasalukuyang mga address para sa Unified Electronic Service:
ang address ng pinag-isang elektronikong serbisyo ng kapaligiran ng pag-unlad ng SMEV 3.0, na tumutugma sa scheme 1.1 - http://smev3-d.test.gosuslugi.ru:7500/smev/v1.1/ws?wsdl, at ang serbisyo ay magkakaroon din magagamit sa

Ang XML Extensible Markup Language ay isang hanay ng mga panuntunan para sa pag-encode ng mga dokumento sa form na nababasa ng makina. Ang XML ay isang sikat na format para sa pagpapalitan ng data sa Internet. Ang mga site na madalas na nag-a-update ng kanilang nilalaman, tulad ng mga site ng balita o blog, ay kadalasang nagbibigay ng XML feed upang malaman ng mga panlabas na programa ang mga pagbabago sa nilalaman. Ang pagpapadala at pag-parse ng XML data ay isang karaniwang gawain para sa mga application na konektado sa network. Ipinapaliwanag ng tutorial na ito kung paano i-parse ang mga XML na dokumento at gamitin ang data ng mga ito.

Pagpili ng Parser

Pagsusuri ng channel

Ang unang hakbang sa pag-parse ng feed ay ang magpasya kung aling mga field ng data ang interesado ka. Kinukuha ng parser ang ibinigay na mga patlang at binabalewala ang lahat ng iba pa.

Narito ang isang snippet ng channel na i-explore sa halimbawang application. Ang bawat post sa StackOverflow.com ay lumalabas sa isang feed bilang isang entry tag, na naglalaman ng ilang mga subtag:

pinakabagong mga tanong na naka-tag sa android - Stack Overflow ... ... http://stackoverflow.com/q/9439999 0 Nasaan ang aking data file? bangin2310 http://stackoverflow.com/users/1128925 2012-02-25T00:30:54Z 2012-02-25T00:30:54Z

Mayroon akong Application na nangangailangan ng data file...

... ...

Kinukuha ng sample na application ang data mula sa entry tag at ang pamagat, link, at buod ng mga subtag nito.

Paglikha ng isang halimbawa ng parser

Ang susunod na hakbang ay i-instantiate ang parser at simulan ang proseso ng pag-parse. Sinisimulan ng snippet na ito ang parser upang hindi mahawakan ang mga namespace at gamitin ang ibinigay na InputStream bilang input. Ang proseso ng pag-parse ay nagsisimula sa isang tawag sa nextTag() at tumatawag sa readFeed() na paraan, na kumukuha at nagpoproseso ng data kung saan interesado ang application:

Pampublikong klase StackOverflowXmlParser ( // Hindi kami gumagamit ng mga namespace na pribadong static na panghuling String ns = null; ang pampublikong List parse(InputStream in) ay naghagis ng XmlPullParserException, IOException ( subukan ( XmlPullParser parser = Xml.newPullParser(); parser.setFeature(CMLESSPullParser(); parser.setFeature(XmlSP_PullNAME) , false); parser.setInput(in, null);

Ibawas ang channel

Ginagawa ng readFeed() na pamamaraan ang aktwal na gawain ng pagproseso ng feed. Ang mga elementong minarkahan ng tag na "entry" ay ang panimulang punto para sa recursive na pagproseso ng channel. Kung ang susunod na tag ay hindi isang entry tag, ito ay nilaktawan. Pagkatapos na muling maproseso ang buong "feed", ang readFeed() ay nagbabalik ng Listahan na naglalaman ng mga entry (kabilang ang mga nested data item) na kinukuha mula sa feed. Ang Listahan na ito ay ibinalik ng parser.

Inihagis ng Pribadong Listahan ang readFeed(XmlPullParser parser) ng XmlPullParserException, IOException ( Mga entry sa listahan = bagong ArrayList (); parser.require(XmlPullParser.START_TAG, ns, "feed"); habang (parser.next() != XmlPullParser.END_TAG) ( kung XmlPullParser.END_TAG) (parser.getEventType() != XmlPullParser.START_TAG) ( continue; ) String name = parser.getName(); // Magsisimula sa pamamagitan ng paghahanap sa entry tag kung (name.equals("entry")) ( entries.add( readEntry(parser) ) else ( skip(parser); ) ) ibalik ang mga entry;

XML parsing

Ang mga hakbang sa pag-parse ng XML feed ay ang mga sumusunod:

Ipinapakita ng snippet na ito kung paano pina-parse ng parser ang entry, pamagat, link, at buod.

Pampublikong static na klase Entry ( pampubliko panghuling String pamagat; pampubliko panghuling String link; pampubliko panghuling String buod; pribadong Entry(String title, String summary, String link) ( this.title = title; this.summary = summary; this.link = link ; ) ) // Pinu-parse ang mga nilalaman ng isang entry. Kung makatagpo ito ng pamagat, buod, o link na tag, ibigay ang mga ito // sa kani-kanilang "basahin" na pamamaraan para sa pagproseso. Kung hindi, laktawan ang tag. private Entry readEntry(XmlPullParser parser) throws XmlPullParserException, IOException ( parser.require(XmlPullParser.START_TAG, ns, "entry"); String title = null; String summary = null; String link = null; while (parser.next() ! = XmlPullParser.END_TAG) ( if (parser.getEventType() != XmlPullParser.START_TAG) ( continue; ) String name = 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) ; ) ) ibalik ang bagong Entry(title, summary, link) // Pinoproseso ang mga title tag sa feed. private String readTitle(XmlPullParser parser) throws IOException, XmlPullParserException ( parser.require(XmlPullParser.START_TAG, ns, "title"); String title = readText(parser); parser.require(XmlPullParser.END_TAG", ns, "title"); return title; ) // Pinoproseso ang mga tag ng link sa feed. private String readLink(XmlPullParser parser) throws IOException, XmlPullParserException ( String link = ""; parser.require(XmlPullParser.START_TAG, ns, "link"); String tag = parser.getName(); String relType = parser.getAttributeValue , "rel"); if (tag.equals("link")) ( if (relType.equals("alternate"))( link = parser.getAttributeValue(null, "href"); parser.nextTag(); ) ) parser.require(XmlPullParser.END_TAG, ns, "link"); private String readSummary(XmlPullParser parser) throws IOException, XmlPullParserException ( parser.require(XmlPullParser.START_TAG, ns, "summary"); String summary = readText(parser); parser.require(XmlPullParser.END_TAG, ns); return summary; ) // Para sa pamagat at buod ng mga tag, kinukuha ang mga halaga ng teksto nito. pribadong String readText(XmlPullParser parser) throws IOException, XmlPullParserException ( String result = ""; kung (parser.next() == XmlPullParser.TEXT) ( result = parser.getText(); parser.nextTag(); ) return result; ) ... )

Nilaktawan ang mga bagay na hindi mo kailangan

Sa isa sa mga hakbang sa pag-parse ng XML na inilarawan sa itaas, nilalaktawan ng parser ang mga tag na hindi kami interesado. Nasa ibaba ang parser code para sa skip() method:

Private void skip(XmlPullParser parser) throws XmlPullParserException, IOException ( if (parser.getEventType() != XmlPullParser.START_TAG) ( throw new IllegalStateException(); ) int depth = 1; while (depth != 0) ( switch (parser. next()) ( case XmlPullParser.END_TAG: depth--; break; case XmlPullParser.START_TAG: depth++; break; ) ) )

Narito kung paano ito gumagana:

  • Ang pamamaraan ay nagtatapon ng isang pagbubukod kung ang kasalukuyang kaganapan ay hindi START_TAG .
  • Kumokonsumo ito ng START_TAG, at lahat ng kaganapan hanggang END_TAG.
  • Upang matiyak na hihinto ito sa tamang END_TAG at hindi sa unang tag pagkatapos ng orihinal na START_TAG, sinusubaybayan nito ang lalim ng nesting.

Kaya, kung ang kasalukuyang elemento ay may mga nested na elemento, ang halaga ng lalim ay hindi magiging 0 hanggang sa maproseso ng parser ang lahat ng mga kaganapan sa pagitan ng orihinal na START_TAG at ang katumbas nitong END_TAG . Halimbawa, isaalang-alang kung paano pumasa ang analyzer isang elemento na mayroong 2 nested na elemento, At :

  • Sa unang pagpasa sa while loop, ang susunod na tag na makikita ng analyzer pagkatapos ito ay START_TAG para sa
  • Sa pangalawang pagpasa sa while loop, ang susunod na tag na nakatagpo ng analyzer ay END_TAG
  • Sa ikatlong pagpasa sa while loop, ang susunod na tag na nakatagpo ng analyzer ay START_TAG . Ang lalim na halaga ay tumaas sa 2.
  • Sa ikaapat na pagpasa sa while loop, ang susunod na tag na nakatagpo ng analyzer ay END_TAG. Ang depth value ay binabawasan sa 1.
  • Sa ikalima at huling pagpasa sa while loop, ang susunod na tag na makakatagpo ng analyzer ay END_TAG. Ang lalim na halaga ay binabawasan sa 0, na nagpapahiwatig na matagumpay na nalaktawan ang elemento.

Pagproseso ng Data ng XML

Ang sample na application ay tumatanggap at nag-parse ng XML feed sa isang AsyncTask. Nagaganap ang pagproseso sa labas ng pangunahing thread ng UI. Kapag kumpleto na ang pagproseso, ina-update ng application ang user interface sa pangunahing aktibidad (NetworkActivity).

Sa snippet sa ibaba, ang paraan ng loadPage() ay gumagawa ng sumusunod:

  • Nagsisimula ng string variable na may URL na tumuturo sa isang XML feed.
  • Kung pinapayagan ng mga setting ng user at koneksyon sa network, tatawag ng bagong DownloadXmlTask().execute(url) . Lumilikha ito ng bagong DownloadXmlTask ​​​​object (AsyncTask subclass) at isinasagawa ang execute() na pamamaraan nito, na nagda-download at nag-parse ng pipe at nagbabalik ng string na resulta na ipapakita sa UI.
pinalawak ng pampublikong klase ang NetworkActivity ng Aktibidad ( public static final String WIFI = "Wi-Fi"; public static final String ANY = "Any"; private static final String URL = "http://stackoverflow.com/feeds/tag?tagnames=android&sort =pinakabago"; // Kung may koneksyon sa Wi-Fi. pribadong static boolean wifiConnected = false; // Kung may koneksyon sa mobile. pribadong static na boolean mobileConnected = false; // Kung dapat i-refresh ang display. pampublikong static na boolean refreshDisplay = true; public static String sPref = null ... // Gumagamit ng AsyncTask upang i-download ang XML feed mula sa stackoverflow.com public void loadPage() ( if((sPref.equals(ANY)) && (wifiConnected || mobileConnected ) ) ( bagong DownloadXmlTask().execute(URL); ) else if ((sPref.equals(WIFI)) && (wifiConnected)) ( new DownloadXmlTask().execute(URL); ) else ( // show error ) )
  • Ang doInBackground() ay nagpapatupad ng loadXmlFromNetwork() na pamamaraan. Ipinapasa nito ang URL ng channel bilang isang parameter. Ang paraan ng loadXmlFromNetwork() ay tumatanggap at nagpoproseso ng channel. Kapag natapos na ang pagproseso, ibabalik nito ang resultang string.
  • Kinukuha ng onPostExecute() ang ibinalik na string at ipinapakita ito sa UI.
// Pagpapatupad ng AsyncTask na ginamit upang i-download ang XML feed mula sa stackoverflow.com. Ang pribadong klase na DownloadXmlTask ​​​​ay nagpapalawak ng AsyncTask ( @Override protected String doInBackground(String... urls) ( try ( return 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); // Ipinapakita ang HTML string sa UI sa pamamagitan ng WebView WebView myWebView = ( WebView) findViewById(R.id.webview); myWebView.loadData(resulta, "text/html", null) )

Nasa ibaba ang paraan ng loadXmlFromNetwork() na tinatawag mula sa DownloadXmlTask. Ginagawa nito ang sumusunod:

  1. Lumilikha ng isang halimbawa ng StackOverflowXmlParser. Lumilikha din ito ng mga variable para sa mga object ng List Entry, at pamagat, url, at buod, upang iimbak ang mga halaga na kinuha mula sa XML feed para sa mga field na ito.
  2. Tumatawag sa downloadUrl() na nagda-download ng channel at ibinabalik ito bilang isang InputStream.
  3. Gumagamit ng StackOverflowXmlParser para i-parse ang isang InputStream. Pino-populate ng StackOverflowXmlParser ang mga entry sa Listahan na may data mula sa feed.
  4. Pinoproseso ang mga entry List , at pinagsasama ang data ng channel sa HTML markup.
  5. Ibinabalik ang HTML string na ipinapakita sa UI ng pangunahing aktibidad, AsyncTask, sa onPostExecute() na paraan.
// Nag-a-upload ng XML mula sa stackoverflow.com, na-parse ito, at pinagsama ito sa // HTML markup. Ibinabalik ang HTML string. private String loadXmlFromNetwork(String urlString) throws XmlPullParserException, IOException ( InputStream stream = null; // Instantiate ang parser StackOverflowXmlParser stackOverflowXmlParser = bagong StackOverflowXmlParser(); mga entry = null;

Pamagat ng string = null;

String url = null; String summary = null; Calendar rightNow = Calendar.getInstance();

DateFormat formatter = bagong SimpleDateFormat("MMM dd h:mmaa");

"); // Kung itinakda ng user ang kagustuhan na isama ang buod ng teksto, // idinaragdag ito sa display. kung (pref) ( htmlString.append(entry.summary); ) ) ibalik ang htmlString.toString(); ) // Dahil sa representasyon ng string ng isang URL, nagse-set up ng isang koneksyon at nakakakuha ng // isang input stream na pribadong InputStream downloadUrl(String urlString) ay naghagis ng IOException ( URL url = bagong URL(urlString); HttpURLConnection conn = (HttpURLConnection) url.openConnection() ; conn.setReadTimeout(10000 /* milliseconds */); );