Simplexml ielādes virkne nedarbojas. SimpleXML apstrāde ar PHP. Kanāla nosaukuma atrašana

Marķējumu bibliotēka XML parsēšanai ar PHP

PHP 5. versija ievieš SimpleXML, jaunu lietojumprogrammu saskarni (API) XML lasīšanai un rakstīšanai. SimpleXML paplašinājumi, piemēram,

$doc->rss->kanāls->vienums->nosaukums

atlasiet elementus no dokumenta. Ja jums ir labs priekšstats par sava dokumenta struktūru, šo izteicienu rakstīšana ir vienkārša. Tomēr, ja jūs precīzi nezināt, kur parādās interesējošie elementi (kā tas ir Docbook, HTML un citu līdzīgu teksta dokumentu gadījumā), SimpleXML var izmantot XPath izteiksmes, lai atrastu šos elementus.

Darba sākšana ar SimpleXML

Pieņemsim, ka vēlaties izveidot PHP lapu, kas pārvērš RSS plūsmu HTML kodā. RSS ir galvenais XML formāts satura publicēšanai no vairākiem avotiem. Šī dokumenta saknes elements ir rss , kurā ir viens kanāla elements. Kanāla elements satur metadatus par saturu, tostarp tā nosaukumu, valodu un URL. Tajā ir arī dažādi teksta elementi, kas ligzdoti vienuma elementos. Katram vienuma elementam ir saites elements, kas satur URL vai nosaukumu vai aprakstu (parasti abi), kas satur lasāmu tekstu. Vārdtelpas netiek izmantotas. Protams, par RSS ir vēl daudz ko teikt, taču šī raksta vajadzībām informācijas pietiek. parāda tipisku piemēru ar pāris informatīviem ziņojumiem.

Saraksts 1. RSS plūsma
Mokka mit Schlag http://www.elharo.com/blog lv Penn Station: pagājis, bet nav aizmirsts Vecā Pennas stacija Ņujorkā tika nojaukta pirms manas dzimšanas. Skatoties uz šiem attēliem, šķiet, ka tā ir kļūda. Pašreizējā vietne ir funkcionāla, bet ne vairāk; tiešām tikai daži biroju torņi un pazemes koridori, kuriem nav īpašas intereses vai skaistuma. Jaunais Madison Square... http://www.elharo.com/blog/new-york/2006/07/31/penn-station Personīga Elliotei Haroldai Daži cilvēki izmanto ļoti nepatīkamus surogātpasta filtrus, kuru veikšanai objektā ir jāievada nejauša virkne, piemēram, E37T. Lieki piebilst, ka ne es, ne vairums citu cilvēku neuztraucamies sazināties ar šiem paranoiķiem. Viņi ļoti pārmērīgi reaģē uz surogātpasta problēmu. Es personīgi nedarīšu... http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/

Izveidosim PHP lapu, kas formatē katru RSS plūsmu kā HTML. parāda nākamās lapas struktūru.

Saraksts 2. Statiskā struktūra PHP kodam
<?php // Заголовок будет читаться из RSS ?>



XML dokumenta parsēšana

Pirmais solis ir parsēt XML dokumentu un saglabāt to mainīgajā. Šim nolūkam ir jāieraksta tikai viena koda rindiņa, kas nodod URL funkcijai simplexml_load_file():

$rss = simplexml_load_file("http://partners.userland.com/nytRss/nytHomepage.xml");
Brīdinājums

Šeit izmantotā shēma ir bīstami tālu no optimālās. Man tiešām nevajadzētu lejupielādēt un analizēt RSS plūsmu katru reizi, kad lapa tiek apmeklēta. Tas palēnina lapas lasītāju darbību un ir potenciāls pakalpojuma atteikums lejupielādētajām RSS plūsmām, jo ​​vairums no tiem iestata maksimālo atjaunināšanas ātrumu aptuveni reizi stundā. Īstais šīs problēmas risinājums ir ģenerētās HTML lapas vai RSS plūsmas, vai abus. Tomēr šis jautājums ir pretrunā ar SimpleXML bibliotēkas izmantošanu, tāpēc es šeit nedaudz pārspīlēju.

Šim piemēram es paņēmu lapu no Userland kanāla Ņujorkas Laiks vietnē http://partners.userland.com/nytRss/nytHomepage.xml. Protams, citai RSS plūsmai varat izmantot jebkuru citu URL.

Ņemiet vērā, ka, neskatoties uz nosaukumu simplexml_load_ failu() , šai funkcijai būs jāparsē XML dokuments attālajā HTTP URL. Bet tas nav vienīgais pārsteigums šajā funkcijā. Funkcijas atgriešanas vērtība, kas šeit tiek saglabāta mainīgajā $rss, nenorāda uz visu dokumentu, kā jūs varētu sagaidīt no pieredzes ar citām API, piemēram, Document Object Model (DOM). Drīzāk tas norāda uz dokumenta saknes elementu. Saturs, kas atrodas dokumenta prologā un epilogā, nav pieejams no SimpleXML.

Kanāla nosaukuma atrašana

Visa kanāla nosaukums (atšķirībā no šī kanāla atsevišķu teksta daļu nosaukumiem) atrodas kanāla elementa nosaukuma bērnelementā, kas ir cēlies no rss saknes elementa. Jūs varat ielādēt šo galveni tā, it kā XML dokuments būtu tikai rss objekta serializēta forma ar lauku kanālu, kam savukārt būtu lauks virsraksts. Izmantojot parasto PHP objekta atsauces sintaksi, šis paziņojums atrod galveni:

$nosaukums = $rss->kanāls->nosaukums;

Kad esat atradis nosaukumu, tas jāpievieno HTML izvadei. To ir viegli izdarīt: atkārtojiet mainīgo $title:

<?php echo $title; ?>

Šī rinda izvada elementa virknes vērtību, bet ne visu elementu. Tas ir, teksts tiek ierakstīts, bet tagi nav.

Varat pat pilnībā izlaist starpposma mainīgo $title:

<?php echo $rss->kanāls->nosaukums; ?>

Tā kā šī lapa daudzās vietās atkārtoti izmanto šo vērtību, man šķiet ērtāk to saglabāt kā mainīgo ar aprakstošu nosaukumu.

Iterācija caur elementiem

$rss->kanāls->vienums

Tomēr kanāli parasti satur vairāk nekā vienu elementu. Vai arī tie var nemaz nepastāvēt. Attiecīgi šis paziņojums atgriež masīvu, kuru varat atkārtot, izmantojot katrai cilpai:

foreach ($rss->channel->item kā $item) ( echo "

". $item->title."

"; atbalss"

". $item->description."

"; }
3. saraksts. Vienkāršs, bet pilnīgs PHP RSS lasītājs
kanāls->nosaukums; ?> <?php echo $title; ?>

kanāls->vienums kā $item) ( atbalss "

saite. "">".$item->title. "

"; atbalss"

". $item->description."

"; } ?>

Tas ir viss, kas nepieciešams, lai uzrakstītu vienkāršu RSS lasītāju PHP — dažas rindiņas HTML un dažas rindiņas PHP. Neskaitot atstarpes, kopā 20 rindas. Protams, šī nav funkcijām bagātākā, optimizētā vai uzticamākā izstrāde. Apskatīsim, ko varam darīt, lai to labotu.

Kļūda apstrādē

Ne visas RSS plūsmas ir tik labi izveidotas, kā tām vajadzētu būt. XML specifikācija nosaka, ka procesoriem jāpārtrauc dokumentu apstrāde, tiklīdz tiek atklāta formāla kļūda, un SimpleXML atbilst XML apstrādes programmai. Tomēr tas jums nepalīdzēs, ja tiek atrasta kļūda. Parasti programma raksta brīdinājumu php kļūdas failā (bet bez detalizēta kļūdas ziņojuma), un funkcija simplexml-load-file() rada kļūdu. Ja neesat pārliecināts, vai parsējamais fails ir labi izveidots, pārbaudiet šo kļūdu pirms faila datu izmantošanas, kā parādīts .

4. saraksts. Uzmanieties no nepareizi veidotas ievades
xpath("//title") kā $title) ( echo "

". $title."

"; ) ) else ( echo "Hmm! Ievade ir nepareizi veidota!"; ) ?>

Vēl viena izplatīta kļūda notiek, ja dokuments ir labi formatēts, bet nesatur gaidītos elementus tur, kur tos gaidāt. Kas notiek, piemēram, ar šādu izteiksmi $doc->rss->channel->item->title , ja elementu grupai nav nosaukuma (kā tas notiek ar vismaz vienu no simts biežākajām RSS plūsmām)? Vienkāršākā pieeja ir vienmēr uzskatīt funkcijas atgriešanās vērtību kā datu masīvu un ietīt to cilpā. Šajā gadījumā jūs esat pasargāts no tā, ka elementu ir vairāk vai mazāk, nekā jūs gaidījāt. Tomēr, ja zināt, ka vēlaties dokumentā pirmo elementu, pat ja ir vairāk nekā viens elements, varat to meklēt, izmantojot indeksu, kura pamatā ir nulle. Piemēram, lai pieprasītu pirmās elementu grupas nosaukumu, varat rakstīt:

$doc->rss->kanāls->vienums->nosaukums

Ja trūkst pirmās elementu grupas vai tai nav nosaukuma, to apstrādā tāpat kā jebkuru citu PHP masīva ārpus robežu indeksu. Tas nozīmē, ka rezultāts ir nulle, kas pārvēršas par tukšu virkni, kad mēģināt to ielīmēt HTML izvades kodā.

Neparedzētu formātu atpazīšana un noraidīšana, ar kuriem neesat gatavs strādāt, parasti ir validējošā XML parsētāja darbības joma. Tomēr SimpleXML nevar pārbaudīt pret DTD veidni (DTD) vai datu shēmu. Tas pārbauda tikai formālu pareizību.

Kā strādāt ar nosaukumvietu

Mūsdienās daudzas vietnes pāriet no RSS uz Atom. parāda dokumenta piemēru programmā Atom. Šis dokuments daudzējādā ziņā ir identisks RSS piemēram. Tomēr šeit ir vairāk metadatu, un saknes elements ir plūsma, nevis rss . Plūsmas elementā elementu vietā ir saraksti. Satura elements aizstāj apraksta elementu. Vēl svarīgāk ir tas, ka Atom dokumentā tiek izmantota nosaukumvieta, bet RSS to neizmanto. Tādējādi Atom dokuments var izvadīt reālu, neizgrieztu paplašināmā HTML (XHTML) saturu.

5. saraksts. Dokuments Atomā
2006-08-04T16:00:04-04:00 http://www.cafeconleche.org/ Cafe con Leche XML ziņas un resursi Autortiesības 2006 Elliotte Rusty Harold Stīvs Palmers ir ievietojis Vienna 2.1 beta versiju, atvērtā koda RSS/Atom klientu operētājsistēmai Mac OS X.

Stīvs Palmers ir ievietojis Vienna 2.1 beta versiju, atvērtā koda RSS/Atom klientu operētājsistēmai Mac OS X. Vīne ir pirmais lasītājs, ko esmu atzinusi par pieņemamu ikdienas lietošanai; nav lielisks, bet pietiekami labs. (Protams, mani standarti ir "labi". pietiekami" ir diezgan augsts.) 2.1 ir vērsta uz lietotāja saskarnes uzlabošanu ar vienotu izkārtojumu, kas ļauj ritināt vairākus rakstus, rakstu filtrēšanu (piem., lasīt visus rakstus kopš pēdējās atsvaidzināšanas), manuālu mapju pārkārtošanu, jaunu informācijas iegūšanas logu un uzlabots saīsināts izkārtojums.

http://www.cafeconleche.org/#August_1_2006_25279 2006-08-01T07:01:19Z
Mets Mullenvegs ir izlaidis Wordpress 2.0.4, emuāru dzinēju, kura pamatā ir PHP un MySQL.

Mets Mullenvegs ir izlaidis Wordpress 2.0.4, emuāru dzinēju, kura pamatā ir PHP un MySQL. 2.0.4 aizver dažādus drošības caurumus, galvenokārt izmantojot spraudņus.

http://www.cafeconleche.org/#August_1_2006_21750 2006-08-01T06:02:30Z

Lai gan elementu nosaukumi ir mainījušies, pamata pieeja darbam ar SimpleXML dokumentos Atom ir tāda pati kā ar RSS. Vienīgā atšķirība ir tāda, ka jānorāda nosaukumvieta, t.i. Uniform Resource Identifier (URI), kad pieprasāt elementu ar nosaukumu, tāpat kā vietējo nosaukumu. Šis ir divpakāpju process: vispirms vaicājiet bērnelementus dotajā nosaukumvietā, nosaukumvietas URI nosūtot funkcijai children(). Pēc tam šajā nosaukumvietā pieprasiet elementus ar pareizo vietējo nosaukumu. Iedomājieties, ka jūs vispirms ielādējāt Atom plūsmu mainīgajā $feed, piemēram:

$feed = simplexml_load_file("http://www.cafeconleche.org/today.atom");

Šīs divas rindas tagad atrod virsraksta elementu:

$bērni = $barība->bērni("http://www.w3.org/2005/Atom"); $nosaukums = $bērni->nosaukums;

Ja vēlaties, varat apkopot šo kodu vienā paziņojumā, lai gan virkne kļūst nedaudz gara. Visi pārējie elementi nosaukumvietās ir jāapstrādā tādā pašā veidā. parāda pilnu PHP lapu, kurā ir redzamas Atom caurules galvenes.

6. saraksts. Vienkāršs PHP galvenes lasītājs Atom
bērni ("http://www.w3.org/2005/Atom"); $nosaukums = $bērni->nosaukums; ?> <?php echo $title; ?>

ieeja; foreach ($entries kā $entry) ( $details = $entry->children("http://www.w3.org/2005/Atom"); echo "

". $details->title."

"; } ?>

Jaukts saturs

Kāpēc šajā piemērā es parādīju tikai galvenes? Jo programmā Atom jebkura saraksta saturs var saturēt pilnu fragmenta tekstu un ne tikai pašu tekstu, bet arī visu marķējumu. Tas - stāstījuma struktūra: vārdi pēc kārtas ir paredzēti cilvēku lasīšanai. Tāpat kā lielākajā daļā šāda veida datu, šeit ir jaukts saturs. XML vairs nav vienkāršots, un tāpēc SimpleXML pieeja sāk klibot. Tas nevar pareizi darboties ar jauktu saturu, un šī datu izlaišana neļauj izmantot daudzos gadījumos.

Jūs varat darīt vienu lietu, taču tas ir tikai daļējs problēmas risinājums. Tas darbosies tikai tāpēc, ka satura elements satur reālu XHTML. Varat kopēt šo XHTML kā neparsētu avota kodu tieši galaproduktā, izmantojot funkciju asXML(), piemēram, šādi:

atbalss"

". $details->content->asXML(). "

";

Rezultāts būs kaut kas līdzīgs.

Saraksts 7. XML izvade

Nikolajs Grigorjevs ir izlaidis SVGMath 0.3 — prezentācijas MathML formatētāju, kas veido SVG, kas rakstīts tīrā Python valodā un publicēts saskaņā ar MIT licenci. Pēc Grigorjeva teiktā, "jaunā versija var darboties ar vairāku nosaukumtelpu dokumentiem (piemēram, XSL-FO vai XHTML dokumentā aizstāt visus MathML apakškokus ar SVG); konfigurācija ir padarīta elastīgāka, un ir novērstas vairākas kļūdas. Ir arī stila lapa. lai pielāgotu iegūtā SVG attēla vertikālo pozīciju XSL-FO.

Tas nav tīrs XHTML. Satura elements tiek izgūts no dokumenta Atom, un jums ir labāk, ja tā nav. Vēl ļaunāk, tas ievada nepareizu nosaukumvietu, tāpēc to nevar atpazīt par to, kas tas ir. Par laimi, praksē šis papildu elements īpaši nekaitē, jo tīmekļa pārlūkprogrammas vienkārši ignorē visus tagus, ko tās neatpazīst. Gatavais dokuments ir bojāts, taču tam nav īsti nozīmes. Ja tas jūs patiešām traucē, anulējiet to ar virknes darbībām, piemēram:

$apraksts = $detaļas->saturs->asXML(); $tags = masīvs(" ", ""); $notags = masīvs("", ""); $apraksts = str_aizvietot($tags, $notags, $description);

Lai padarītu kodu nedaudz stabilāku, izmantojiet regulāro izteiksmi, nevis pieņemot, ka sākuma tags ir tieši tāds, kā parādīts iepriekš. Īpaši jūs varat aprēķināt daudzus iespējamos atribūtus:

// beigu tagam ir noteikta forma, tāpēc ir viegli aizstāt $description = str_replace("", "", $description); // noņemiet sākuma tagu, ieskaitot atribūtus un atstarpi, ja iespējams $description = ereg_replace(" ]*>", "", $apraksts);

Pat ar šo modifikāciju jūsu kods var izdot komentārus, skaitļošanas komandas un CDATA fragmentus. Jebkurā gadījumā jūs to pārtraucat, lai gan es baidos, ka tas vairs nav tik vienkārši. Jauktais saturs vienkārši šķērso robežas, kurās SimpleXML tika izstrādāts darbam.

XPath

Izteicieni, piemēram, $rss->channel->item->title, ir lieliski tikai tad, ja precīzi zināt, kādi elementi atrodas dokumentā un kur tie atrodas. Tomēr jūs ne vienmēr to zināt. Piemēram, XHTML elementi galvenē (h1 , h2 , h3 utt.) var būt ķermeņa , div , tabulas un vairāku citu elementu atvasinājumi. Turklāt div , table , blockquote un citus elementus var ligzdot vairākas reizes. Daudzos mazāk specifiskos lietošanas gadījumos ir vieglāk izmantot XPath izteiksmes, piemēram, //h1 vai //h1. SimpleXML ir šī funkcionalitātes kopa, izmantojot funkciju xpath().

Saraksts 9. XPath izmantošana ar nosaukumvietām
$atom = simplexml_load_file("http://www.cafeconleche.org/today.atom"); $atom->registerXPathNamespace("atm", "http://www.w3.org/2005/Atom"); $nosaukumi = $atom->xpath("//atm:nosaukums"); foreach ($titles kā $title) ( echo "

". $title."

"; }

Pēdējais brīdinājums: XPath PHP darbojas diezgan lēni. Lapas ielāde var ilgt no brīža līdz dažām sekundēm, kad es pārslēdzos uz šo XPath izteiksmi, pat ja lokālais serveris nav ielādēts. Ja izmantojat šos trikus, jums ir jāizmanto sava veida kešatmiņa, lai gudri strādātu. Katras lapas dinamiska ģenerēšana vienkārši nedarbosies.

Secinājums

SimpleXML ir noderīgs papildinājums PHP izstrādātāja rīku komplektam, ja vien jums nav jāstrādā ar jauktu saturu. Tas aptver lielu skaitu lietošanas gadījumu. Tas īpaši labi darbojas ar vienkāršiem datiem ierakstu veidā. Kamēr dokuments nav pārāk dziļš, pārāk sarežģīts un tam nav jaukta satura, SimpleXML ir daudz vienkāršāks nekā tā DOM alternatīva. Tas ir noderīgi arī tad, ja jūs zināt dokumenta struktūru pirms laika, lai gan XPath izmantošana var ievērojami atvieglot šo prasību. Jaukta satura apstiprināšanas un atbalsta trūkums ir traucēklis, ne vienmēr traucēklis. Daudzos vienkāršos formātos nav jaukta satura, un daudzos lietošanas gadījumos tiek izmantoti tikai ļoti paredzami datu formāti. Ja tas ir tas, kas raksturo jūsu darbu, nekautrējieties izmēģināt SimpleXML. Pievēršot nelielu uzmanību kļūdām un nedaudz pielāgojot kešatmiņu, lai samazinātu veiktspējas problēmas līdz minimumam, SimpleXML var būt stabils, kļūdām izturīgs XML apstrādes rīks PHP.

XML parsēšana būtībā nozīmē XML dokumenta izpēti un atbilstošo datu atgriešanu. Lai gan arvien vairāk tīmekļa pakalpojumu atgriež datus JSON formātā, lielākā daļa joprojām izmanto XML, tāpēc ir svarīgi apgūt XML parsēšanu, ja vēlaties izmantot visu pieejamo API klāstu.

Izmantojot paplašinājumu SimpleXML PHP, kas tika pievienots atpakaļ PHP 5.0, strādāt ar XML ir ļoti viegli un vienkārši. Šajā rakstā es jums parādīšu, kā to izdarīt.

Lietošanas pamati

Sāksim ar šādu piemēru valodas.xml:


>

> 1972>
> Deniss Ričijs >
>

> 1995>
> Rasmuss Lerdorfs >
>

> 1995>
> Džeimss Goslings >
>
>

Šajā XML dokumentā ir programmēšanas valodu saraksts ar informāciju par katru valodu: tā ieviešanas gads un tā veidotāja vārds.

Pirmais solis ir ielādēt XML, izmantojot vai nu funkcijas simplexml_load_file(), vai simplexml_load_string(). Kā norāda funkciju nosaukums, pirmā ielādēs XML no faila, bet otrā ielādēs XML no virknes.

Abas funkcijas nolasa visu DOM koku atmiņā un atgriež objektu SimpleXMLElement. Iepriekš minētajā piemērā objekts tiek saglabāts mainīgajā $languages. Varat izmantot funkcijas var_dump() vai print_r() lai saņemtu detalizētu informāciju par atgriezto objektu, ja vēlaties.

SimpleXMLElement objekts
[lang] => Masīvs
[0] => SimpleXMLElementObject
[@attributes] => Masīvs
[vārds] => C
[parādījās] => 1972. gads
[ veidotājs] => Deniss Ričijs
[1] => SimpleXMLElement objekts
[@attributes] => Masīvs
[vārds] => PHP
[parādījās] => 1995. gads
[ veidotājs] => Rasmuss Lerdorfs
[2] => SimpleXMLElement objekts
[@attributes] => Masīvs
[vārds] => Java
[parādījās] => 1995. gads
[ veidotājs] => Džeimss Goslings
)
)

Šis XML satur saknes elementu valodas, kas satur trīs elementus lang. Katrs masīva elements atbilst elementam valodu XML dokumentā.

Izmantojot operatoru, varat piekļūt objekta īpašībām -> . Piemēram, $languages->lang atgriezīs SimpleXMLElement objektu, kas atbilst pirmajam elementam valodu. Šis objekts satur divus rekvizītus: parādījās un veidotājs.

$languages ​​​​-> lang [ 0 ] -> parādījās ;
$languages ​​​​-> lang [ 0 ] -> veidotājs ;

Valodu saraksta parādīšana un to rekvizītu parādīšana ir ļoti vienkārša, izmantojot standarta cilpu, piemēram, katram.

foreach ($languages ​​​​-> lang kā $lang ) (
printf (
"" ,
$lang["nosaukums"],
parādījās $lang -> ,
$lang -> veidotājs
) ;
}

Ievērojiet, kā es piekļuvu lang elementa atribūta nosaukumam, lai iegūtu valodas nosaukumu. Tādā veidā jūs varat piekļūt jebkuram elementa atribūtam, kas attēlots kā SimpleXMLElement objekts.

Darbs ar nosaukumu telpām

Strādājot ar dažādu tīmekļa pakalpojumu XML, jūs bieži saskaraties ar elementu nosaukumvietām. Mainīsim savu valodas.xml lai parādītu nosaukumvietas izmantošanas piemēru:



xmlns:dc =>

> 1972>
> Deniss Ričijs >
>

> 1995>
> Rasmuss Lerdorfs >
>

> 1995>
> Džeimss Goslings >
>
>

Tagad elements radītājs ievietots nosaukumvietā dc, kas norāda uz http://purl.org/dc/elements/1.1/. Ja mēģināt izdrukāt valodas veidotājus, izmantojot mūsu iepriekšējo kodu, tas nedarbosies. Lai lasītu elementu nosaukumvietas, jums jāizmanto viena no tālāk norādītajām pieejām.

Pirmā pieeja ir izmantot URI nosaukumus tieši kodā, atsaucoties uz elementa nosaukumvietu. Šis piemērs parāda, kā tas tiek darīts:

$dc = $valodas> -> lang [1] -> bērni( "http://purl.org/dc/elements/1.1/") ;
echo $dc -> veidotājs ;

Metode bērni () aizņem nosaukumvietu un atgriež pakārtotos elementus, kas sākas ar prefiksu. Tam nepieciešami divi argumenti, pirmais ir XML nosaukumvieta, bet otrais ir izvēles arguments, kas tiek izmantots pēc noklusējuma viltus. Ja otrais arguments ir iestatīts uz TRUE, nosaukumvieta tiks uzskatīta par prefiksu. Ja FALSE, nosaukumvieta tiks uzskatīta par URL nosaukumvietu.

Otra pieeja ir nolasīt URI nosaukumus no dokumenta un izmantot tos, atsaucoties uz elementa nosaukumvietu. Tas patiesībā ir labākais veids, kā piekļūt elementiem, jo ​​jums nav jābūt iekodētam URI.

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

echo $dc -> veidotājs ;

Metode GetNamespaces() atgriež prefiksu nosaukumu masīvu un ar tiem saistītos URI. Tam ir nepieciešams papildu parametrs, kas tiek iestatīts pēc noklusējuma viltus. Ja instalējat to kā taisnība, tad šī metode atgriezīs vecāku un bērnu mezglos izmantotos nosaukumus. Pretējā gadījumā tas atrod nosaukumvietas, kas tiek izmantotas tikai vecākmezglā.

Tagad jūs varat atkārtot šādu valodu sarakstu:

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

foreach ($languages ​​​​-> lang kā $lang ) (
$dc = $lang -> bērni ($ns [ "dc" ] ) ;
printf (
"

%s parādījās %d, un to izveidoja %s .

" ,
$lang["nosaukums"],
parādījās $lang -> ,
$dc -> veidotājs
) ;
}

Gadījuma izpēte — YouTube video kanāla parsēšana

Apskatīsim piemēru, kas saņem RSS plūsmu no YouTube kanāla un parāda saites uz visiem videoklipiem no tā. Lai to izdarītu, lūdzu, sazinieties ar šo adresi:

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

URL atgriež sarakstu ar jaunākajiem videoklipiem no konkrētā kanāla XML formātā. Mēs parsēsim XML un iegūsim šādu informāciju par katru videoklipu:

  • Saite uz video
  • Miniatūra
  • Vārds

Sāksim ar XML meklēšanu un ielādi:

$channel = "ChannelName" ;
$url = "http://gdata.youtube.com/feeds/api/users/". $kanāls. "/augšupielādes" ;
$xml = file_get_contents ($url ) ;

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

Ja paskatās uz XML plūsmu, jūs varat redzēt, ka tajā ir vairāki elementi. entītija, no kuriem katrs glabā detalizētu informāciju par konkrētu videoklipu no kanāla. Bet mēs izmantojam tikai attēlu sīktēlus, video adresi un nosaukumu. Šie trīs elementi ir elementa bērni grupai, kas savukārt ir bērns no ierakstu:

>

>



Nosaukums... >

>

>

Mēs vienkārši iziesim cauri visiem elementiem ierakstu un iegūstiet nepieciešamo informāciju par katru no tiem. pieraksti to spēlētājs, sīktēls un virsraksts atrodas multivides nosaukumvietā. Tādējādi mums ir jārīkojas tāpat kā iepriekšējā piemērā. Mēs iegūstam nosaukumus no dokumenta un izmantojam nosaukumvietu, atsaucoties uz elementiem.

foreach ($feed -> ieraksts kā $entry ) (
$grupa = $entry -> bērni ($ns [ "media" ] ) ;
$grupa = $grupa -> grupa ;
$thumbnail_attrs = $grupa -> sīktēls [ 1 ] -> atribūti () ;
$image = $thumbnail_attrs [ "url"];
$spēlētājs = $grupa -> spēlētājs -> atribūti () ;
$saite = $player["url"] ;
$nosaukums = $grupa -> nosaukums ;
printf ( "

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

Secinājums

Tagad, kad jūs zināt, kā izmantot SimpleXML lai parsētu XML datus, varat uzlabot savas prasmes, parsējot dažādas XML plūsmas ar dažādām API. Taču ir svarīgi paturēt prātā, ka SimpleXML nolasa visu DOM atmiņā, tādēļ, ja parsējat lielu datu kopu, var pietrūkt atmiņas. Lai uzzinātu vairāk par SimpleXML, izlasiet dokumentāciju.


Ja jums ir kādi jautājumi, lūdzu, izmantojiet mūsu

Man ir darīšana ar trešās puses PHP bibliotēku, kuru nevaru rediģēt, un tā darbojas labi jau gandrīz gadu. Tas izmanto simplexml_load_string, lai atbildētu no attālā servera. Pēdējā laikā viņš ir aizrījies ar lielām atbildēm. Šī ir nekustamā īpašuma objektu datu plūsma, un arī formāts izskatās apmēram šādi:

sysid 1 2 3 4 5 6 252370080 Dzīvojamā 0,160 Nr ADDR0 06051 252370081 Dzīvojamā 0,440 Jā ADDR0 06043 252370082 Dzīvojamā 1.010 Nr ADDR0 06023 Vairāk tabulēšanas atdalīta teksta

Es lejupielādēju atbildes faila piemēru (apmēram 22 MB), un tur es beidzu ar savu atkļūdošanu un veselo saprātu. Abos serveros darbojas PHP 5.3.8 versija, taču ņemiet vērā atšķirīgos rezultātus. Esmu diezgan pārliecināts, ka abi faili ir vienādi (es domāju, ka dažādus failu tipus, strlen un pēdējās 50 rakstzīmes var izskaidrot ar Windows jaunām rindiņām, kurām ir papildu karieta atgriešanas rakstzīme). Testa scenārijs:

kļūdu_ziņošana(-1); ini_set("displeja_kļūdas", 1); $fails = "error-example.xml"; $xml = fails_get_contents($fails); echo "faila izmērs:"; var_dump(faila izmērs($fails)); echo "strlen:"; var_dump(strlen($xml)); echo "simplexml objekts? "; var_dump(is_object(simplexml_load_string($xml))); echo "Pēdējās 50 rakstzīmes: "; var_dump(substr($xml, -50));

Lokālā izvade operētājsistēmā Windows:

Faila izmērs: int(21893604) strlen: int(21893604) simplexml objekts? bool(true) Pēdējās 50 rakstzīmes: string(50) "RD DR CT Watertown 203-555-5555 "

Izvade attālajā UNIX serverī:

Faila izmērs: int(21884093) strlen: int(21884093) simplexml objekts? Brīdinājums: simplexml_load_string(): Entītija: rinda 9511: parsētāja kļūda: iekšēja kļūda /path/to/test.php 19. rindā Brīdinājums: simplexml_load_string(): AULTED CEILING IN FOYER, BRICK FP IN FR, NEW FLOORING IN LR DR FR FOYER KITCHEN mapē /path/to/test.php 19. rindā Brīdinājums: simplexml_load_string(): ^in /path/to/test.php 19. rindā Brīdinājums: simplexml_load_string(): Entītija: 9511. rinda: parsētāja kļūda: Papildu saturs dokumenta beigas mapē /path/to/test.php 19. rindā Brīdinājums: simplexml_load_string(): AULTED CEILING IN FOYER, BRICK FP IN FR, NEW FLOORING IN LR DR FR FOYER KITCHEN in /path/to/test.php 19. rindā Brīdinājums: simplexml_load_string(): ^in /path/to/test.php 19. rindā bool(false) Pēdējās 50 rakstzīmes: string(50) "ORD DR CT Watertown 203-555-5555 "

Dažas atbildes uz komentāriem un papildu informācija:

    Pats XML šķiet derīgs, cik es varu pateikt (un tas dara strādāt pie manas sistēmas).

    magic_quotes_runtime noteikti ir izslēgts.

    Darba serverim ir libxml versija 2.7.7, bet otra versija ir 2.7.6. Vai tas tiešām var kaut ko mainīt? Es nevarēju atrast libxml izmaiņu žurnālu, taču tas šķiet maz ticams.

    Tas notiek tikai tad, ja atbilde/fails pārsniedz noteiktu lielumu, un kļūda vienmēr rodas nākamajā rindā.

    Es nesaskaros ar atmiņas problēmām, testa skripts tiek palaists uzreiz.

Ir atšķirības PHP konfigurācijās, kuras varu publicēt, ja zinātu, kuras no tām ir atbilstošas. Vai jums ir ideja, kas varētu būt problēma, vai zināt kaut ko citu, ko varu pārbaudīt?

SimpleXMLElement-> asXML

SimpleXMLElement->asXML — atgriež labi veidotu XML dokumentu

Apraksts

Jaukts SimpleXMLElement-> asXML()

Metode asXML ģenerē datus XML versijā 1.0.

Parametru saraksts
faila nosaukums
Ja norādīts, metode ierakstīs datus norādītajā failā.
Atgriešanas vērtības
Ja faila nosaukums ir norādīts, metode ierakstīs XML datus norādītajā failā. Pretējā gadījumā metode atgriezīs XML datus kā virkni.
Piezīmes
Ja avota dokumentā ir norādīts XML dokumenta kodējums galvenēs, izmantojot kodēšanas parametru, tad asXML metode atgriezīs XML dokumentu norādītajā kodējumā. XML dokumenta kodējuma maiņa, izmantojot SIMPLEXML paplašinājumu, nav iespējama.
Piemēri
1. piemērs: izvades XML

$string =<<

tekstu
sīkumi


kodu

XML

echo $xml->asXML(); //tekstusīkumi
...?>

AsXML metode var darboties arī ar Xpath:

2. piemērs. Metodes asXML() izmantošana ar Xpath

// Iepriekš minētā piemēra turpinājums.
/* Meklēt */
$rezultāts = $xml->xpath("/a/b/c");
while(saraksts(, $mezgls) = katrs($rezultāts)) (
atbalss $mezgls->asXML(); // tekstu un sīkumi
}
?>

SimpleXMLElement-> atribūti

SimpleXMLElement->attributes — atgriež elementa atribūtus.

Apraksts

SimpleXMLElement simplexml_element->attributes()

Šī funkcija atgriež atlasītā xml elementa atribūtu nosaukumus un vērtības. Piezīme. SimpleXML ir kārtula, kas paredzēta iteratīvu īpašību pievienošanai lielākajai daļai metožu. Tos nevar pārbaudīt, izmantojot var_dump() vai jebkuru citu objektu parsētāju.

1. piemērs: XML virknes interpretācija

$string =<<
[aizsargāts ar e-pastu]

XML
$xml = simplexml_load_string($string);
foreach($xml->lietotāji->atribūti() kā $a => $b) (
atbalss $a,"="",$b,"\"\n";
}
?>

Šis piemērs izvadīs:

Name = "Jevgen"
vecums = "27

SimpleXMLElement->bērni

SimpleXMLElement->childs — atgriež dotā elementa pakārtotos elementus

Apraksts

SimpleXMLElement simplexml_element->childs()

Šī metode atrod bērna elementus dotajam elementam.

Piezīme. SimpleXML ir kārtula, kas paredzēta iteratīvu īpašību pievienošanai lielākajai daļai metožu. Tos nevar pārbaudīt, izmantojot var_dump() vai jebkuru citu objektu parsētāju.

1. piemērs: Bērni() metodes izmantošana

$xml = simplexml_load_string(
"










");
atbalss"

";
?>

Šis piemērs izvadīs:

php-help.ru
links.php-help.ru
forum.php-help.ru
server.php-spravka.ruyandex.ru
money.yandex.ru
map.yandex.ru
market.yandex.ru

SimpleXMLElement->xpath

SimpleXMLElement->xpath — veic Xpath vaicājumu XML datiem

Apraksts

Masīvs SimpleXMLElement->xpath (virknes ceļš)

Metode xpath meklē SimpleXML elementa bērnu elementus, kuru ceļš ir norādīts ceļa parametrā. Metode atgriež SimpleXMLElement objektu masīvu.

Piemērs 1. Xpath

$string =<<

tekstu
sīkumi


kodu

vienkāršs



XML
$xml = simplexml_load_string($string);
/* Meklēt pēc */
$rezultāts = $xml->xpath("/a/b/c");
foreach ($rezultāts kā $node) (
echo "/a/b/c:" . $mezgls. "
";
}
/* Darbojas arī relatīvie ceļi... */
$rezultāts = $xml->xpath("b/c");
foreach ($rezultāts kā $node) (
atbalss "b/c:" . $mezgls. "
";
}
?>

Šis skripts izvadīs:

/a/b/c: teksts
/a/b/c:stuffb/c:textb/c:stuff

Šajā gadījumā abi rezultāti ir vienādi.

simplexml_import_dom (PHP 5)

simplexml_import_dom — atgriež SimpleXMLElement objektu, kas izveidots no DOM objekta.

Apraksts

SimpleXMLElement simplexml_import_dom(DOMNode mezgls[, virknes klases_nosaukums])

Šī funkcija ņem DOM objektu un uz tā pamata izveido SimpleXML objektu.

Šo jauno objektu var izmantot kā parastu SimpleXML objektu.

Ja objekta izveides laikā radās kļūdas, metode atgriezīsies false.

1. piemērs Importēt DOM

$dom = jauns domDocument;
$dom->loadXML(" php-spravka.ru");
if (!$dom) (
echo "Kļūda parsējot dokumentu!";
Izeja;
}
$s = simplexml_import_dom($dom);
echo $s->site->url; // php-help.ru
?>

simplexml_load_file (PHP 5)

simplexml_load_file — interpretē XML failu objektā

Apraksts

Objekta simplexml_load_file(virknes faila nosaukums[, virknes klases_nosaukums[, int opcijas]])

Šī funkcija interpretē faila nosaukumu ar labi veidotiem XML datiem SimpleXMLElement objektā. Ja XML datos ir kļūdas, funkcija atgriezīs FALSE.

Varat izmantot neobligāto parametru class_name funkcijā simplexml_load_file(), lai funkcija atgrieztu norādītās klases objektu. Šajā gadījumā klasei ir jābūt klases SimpleXMLElement paplašinājumam.

Kopš PHP 5.1.0 un Libxml 2.6.0 varat izmantot izvēles opciju parametru, kura specifikācija ir aprakstīta papildu Libxml parametros.

Piezīme. Libxml 2 pārvērš URL pareizā formā. Tie. ja URL virknē vēlaties iestatīt a uz b&c, jums nav jādara:

Simplexml_load_file(rawurlencode("http://example.com/?a=" . urlencode("b&c"))).

Kopš PHP 5.1.0 tas tiek darīts automātiski.

1. piemērs: XML dokumenta interpretācija

// Fails test.xml satur XML dokumentu ar saknes elementu
// un ligzdots virsraksta elements //title.if (file_exists("test.xml")) (
$xml = simplexml_load_file("test.xml");

Var_dump($xml);
) cits (
exit("Kļūda atverot test.xml.");
}
?>
Šis piemērs izvadīs sekojošo: SimpleXMLElement Object(
=> Pārbaudīt galveni
...
)

Šajā piemērā varat atsaukties uz nosaukuma elementu šādi: $xml->title.

simplexml_load_string(PHP 5)

simplexml_load_string — interpretē XML virkni objektā

Apraksts

Objekta simplexml_load_string(virknes dati[, virknes klases_nosaukums[, int opcijas]])

Šī funkcija paņem "pareizo" XML dokumentu datu virknē un atgriež SimpleXMLElement klases objektu, kura īpašības ir vienādas ar xml dokumenta saturu. Ja XML dokumentā ir kļūdas, funkcija atgriezīs FALSE.

Varat izmantot neobligāto parametru class_name, lai funkcija simplexml_load_string() atgrieztu dotās klases objektu. Šai klasei ir jāpaplašina SimpleXMLElement klase.

Sākot ar PHP 5.1.0 un Libxml 2.6.0, varat izmantot arī izvēles opciju parametru, kura saturs ir definēts papildu Libxml parametros.

1. piemērs: XML virknes pārveidošana

$string =<<

Četrdesmit Kas?
Džo
Džeina





XML
$xml = simplexml_load_string($string);
var_dump($xml);
?>
Šis piemērs izvadīs: SimpleXMLElement Object(
=> Četrdesmit Kas?
=> Džo
=> Džeina
=>
Es zinu, ka tā ir atbilde, bet kāds ir jautājums?
)

Šajā piemērā varat izmantot arī $xml->body konstrukcijas utt.

SimpleXML ir diezgan vienkāršs un tajā pašā laikā diezgan spēcīgs veids, kā apstrādāt xml datus. SimpleXML būtība ir tāda, ka viss XML kods tiek pārveidots par PHP objektu, kas padara darbu ar to diezgan vienkāršu. Strādājot ar simpleXML, visiem datiem jābūt UTF-8 kodējumā.

Visbiežāk konvertēšana uz PHP objektu tiek veikta, izmantojot funkciju simplexml_load_file, tālāk ir piemēri darbam ar to. Varat arī izmantot funkciju simplexml_load_string, PHP objekta izveide no XML virknes

Vispirms izveidosim xml failu

Nākamajā piemērā tiks parādīta tikai otrās automašīnas cena.

Lai vienlaikus parādītu visu xml kodu vai vienu mezglu, tiek izmantota metode asXML().

simpleXML atbalsta arī adresēšanu, izmantojot XPath valodu. Nākamajā piemērā tiks atlasīti visi "gada" mezgli un atgriezti to masīvs.

Elementu vērtību aizstāšana tiek veikta, vienkārši piešķirot vērtību

Nomainot mezglus, kuriem ir pakārtoti mezgli, jāievēro piesardzība, jo visi bērnu mezgli tiks noņemti.

Divos iepriekšējos piemēros atmiņā esošie xml dati tika modificēti, taču tie netika ierakstīti diskā. Lai pārrakstītu datus failā, izmantojiet funkciju file_put_contents()

Ir iespējams arī integrēt simpleXML un Dom, izmantojot funkciju Simplexml_import_dom().

Šis piemērs parādīs, kā iegūt elementu atribūtu vērtību.