Ablakok.  Vírusok.  Jegyzetfüzetek.  Internet.  hivatal.  Segédprogramok.  Drivers

Egy harmadik féllel van dolgom PHP könyvtár, amit nem tudok szerkeszteni, és majdnem egy éve jól működik. A simplexml_load_string karakterláncot használja a távoli kiszolgálóról való válaszadáshoz. Mostanában fuldoklott a nagy válaszoktól. Ez az ingatlanobjektumok adattáblázata, és a formátum is valahogy így néz ki:

sysid 1 2 3 4 5 6 252370080 Lakossági 0,160 Nem ADDR0 06051 252370081 Lakossági 0,440 Igen ADDR0 06043 252370082 Lakossági 1.010 Nem ADDR0 06023 További tabulátorral tagolt szöveg

Letöltöttem egy példa válaszfájlt (kb. 22 MB), ott kötöttem ki a hibakeresésem és a józan eszem. Mindkét kiszolgálón a PHP 5.3.8-as verziója fut, de vegye figyelembe az eltérő eredményeket. Biztos vagyok benne, hogy mindkét fájl ugyanaz (ezt feltételezem különböző típusok fájlok, strlen és utolsó 50 karakter magyarázható az új Windows vonalak, amelyek további kocsivissza karakterrel rendelkeznek). Teszt forgatókönyv:

hibabejelentés(-1); ini_set("megjelenítési_hibák", 1); $file = "error-example.xml"; $xml = file_get_contents($file); echo "fájlméret: "; var_dump(fájlméret($fájl)); echo "strlen: "; var_dump(strlen($xml)); echo "simplexml objektum? "; var_dump(is_object(simplexml_load_string($xml))); echo "Utolsó 50 karakter: "; var_dump(substr($xml, -50));

Helyi kimenet Windows rendszeren:

Fájlméret: int(21893604) strlen: int(21893604) simplexml objektum? bool(true) Utolsó 50 karakter: string(50) "RD DR CT Watertown 203-555-5555 "

Kimenet a távoli UNIX szerveren:

Fájlméret: int(21884093) strlen: int(21884093) simplexml objektum? Figyelmeztetés: simplexml_load_string(): Entitás: 9511. sor: Elemző hiba: belső hiba a /path/to/test.php fájlban a 19. sorban Figyelmeztetés: simplexml_load_string(): ELŐTERÜLŐ MENNYEZET TÉGLA FR, ÚJ PADLÓ LR DR FR-ben FOYER KITCHEN in /path/to/test.php a 19. sorban Figyelmeztetés: simplexml_load_string(): ^in /path/to/test.php on 19. Figyelmeztetés: simplexml_load_string(): Entitás: 9511. sor: Elemző hiba: Extra tartalom itt a dokumentum vége a /path/to/test.php fájlban a 19. sorban Figyelmeztetés: simplexml_load_string(): ELŐSÍTETT MENNYEZET, TÉGLA FP FR-BEN, ÚJ PADLÓ LR DR FR ELŐTEREMÉNY KONYHÁBAN a /path/to/test.php-ben on 19. sorban Figyelmeztetés: simplexml_load_string(): ^in /path/to/test.php on 19. sor bool(false) Utolsó 50 karakter: string(50) "ORD DR CT Watertown 203-555-5555 "

Néhány válasz a megjegyzésekre és további információk:

    Maga az XML érvényesnek tűnik, amennyire meg tudom állapítani (és ez csinál működik a rendszeremen).

    A magic_quotes_runtime határozottan ki van kapcsolva.

    A működő szerver libxml verziója 2.7.7, a másik pedig 2.7.6. Valóban változtathat? Nem találtam a libxml változásnaplót, de ez valószínűtlennek tűnik.

    Ez csak akkor történik meg, ha a válasz/fájl egy bizonyos méretet meghaladó, és a hiba mindig a következő sorban jelentkezik.

    Nem ütközök memóriaproblémákba, a tesztszkript azonnal lefut.

Különbségek vannak a PHP konfigurációkban, amelyeket közzétehetek, ha tudnám, hogy melyik releváns. Van valami ötleted, hogy mi lehet a probléma, vagy tudsz valami mást, amit ellenőrizhetek?

Az XML elemzése lényegében azt jelenti, hogy végigmegyünk egy XML dokumentumon, és visszaadjuk a megfelelő adatokat. És bár minden több A webszolgáltatások JSON formátumban adják vissza az adatokat, de a legtöbb továbbra is XML-t használ, ezért fontos elsajátítani XML elemzés ha az elérhető API-k teljes skáláját szeretné használni.

A kiterjesztés használata SimpleXML a PHP-ben, amelyet a PHP 5.0-ban adtak hozzá, az XML-lel való munkavégzés nagyon könnyű és egyszerű. Ebben a cikkben megmutatom, hogyan kell csinálni.

Használati alapok

Kezdjük a következő példával nyelvek.xml:


>

> 1972>
> Dennis Ritchie >
>

> 1995>
> Rasmus Lerdorf >
>

> 1995>
> James Gosling >
>
>

Ez az XML-dokumentum a programozási nyelvek listáját tartalmazza, néhány információval az egyes nyelvekről: a megvalósítás éve és a készítő neve.

Az első lépés az XML betöltése a függvények használatával simplexml_load_file(), vagy simplexml_load_string(). Ahogy a függvények neve is sugallja, az első egy fájlból, a második pedig egy karakterláncból tölti be az XML-t.

Mindkét függvény beolvassa a teljes DOM-fát a memóriába, és visszaad egy objektumot SimpleXMLElement. A fenti példában az objektum a $languages ​​változóban van tárolva. Használhat funkciókat var_dump() vagy print_r() hogy részletes információkat kapjon a visszaküldött objektumról, ha úgy tetszik.

SimpleXMLElement objektum
[lang] => Tömb
[ 0 ] => SimpleXMLElementObject
[@attributes] => Tömb
[név] => C
[megjelent] => 1972
[ alkotó] => Dennis Ritchie
[ 1 ] => SimpleXMLElement objektum
[@attributes] => Tömb
[név] => PHP
[megjelent] => 1995
[ alkotó] => Rasmus Lerdorf
[ 2 ] => SimpleXMLElement objektum
[@attributes] => Tömb
[név] => Java
[megjelent] => 1995
[ alkotó] => James Gosling
)
)

Ez az XML tartalmazza a gyökérelemet nyelvek, amely három elemet tartalmaz lang. Minden tömbelem egy elemnek felel meg nyelv egy XML dokumentumban.

Egy objektum tulajdonságait az operátor segítségével érheti el -> . Például a $languages->lang egy SimpleXMLElement objektumot ad vissza, amely megfelel az első elemnek nyelv. Ez az objektum két tulajdonságot tartalmaz: megjelent és létrehozó.

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

A nyelvek listájának megjelenítése és tulajdonságaik megjelenítése nagyon egyszerű szabványos hurokkal, mint pl az egyes.

foreach ($languages> -> lang mint $lang ) (
printf (
"" ,
$lang["név"] ,
$lang -> megjelent ,
$lang -> alkotó
) ;
}

Figyelje meg, hogyan jutottam hozzá a lang elem attribútumnevéhez, hogy megkapjam a nyelv nevét. Így elérheti a SimpleXMLElement objektumként ábrázolt elem bármely attribútumait.

Névterekkel való munka

A különféle webszolgáltatások XML-ével való munka során gyakran találkozhat elemnévterekkel. Változtassuk meg nyelvek.xml hogy példát mutassunk a névtér használatára:



xmlns:dc =>

> 1972>
> Dennis Ritchie >
>

> 1995>
> Rasmus Lerdorf >
>

> 1995>
> James Gosling >
>
>

Most elem Teremtő névtérbe helyezve dc, amely a http://purl.org/dc/elements/1.1/ címre mutat. Ha megpróbálja kinyomtatni a nyelvi alkotókat a korábbi kódunkkal, az nem fog működni. Az elemek névtereinek olvasásához a következő módszerek egyikét kell használnia.

Az első megközelítés az, hogy az URI-neveket közvetlenül a kódban használjuk, amikor az elem névterére hivatkozunk. A következő példa bemutatja, hogyan történik ez:

$dc = $nyelvek-> lang [1] -> gyermek( "http://purl.org/dc/elements/1.1/") ;
echo $dc -> creator ;

Módszer gyermekek() névteret vesz, és előtaggal kezdődő gyermekelemeket ad vissza. Két argumentumra van szükség, az első az XML névtér, a második pedig egy opcionális argumentum, amely alapértelmezés szerint az hamis. Ha a második argumentum értéke IGAZ, a névteret előtagként kezeli a rendszer. Ha FALSE, akkor a névteret az URL névtérként kezeli a rendszer.

A második megközelítés az URI-nevek beolvasása a dokumentumból, és az elem névterére történő hivatkozáskor használja őket. Valójában ez a legjobb módja az elemek elérésének, mert nem kell URI-ba kódolni.

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

echo $dc -> creator ;

Módszer GetNamespaces() előtagnevek és a hozzájuk tartozó URI-k tömbjét adja vissza. Szükség van egy további paraméterre, amely az alapértelmezett hamis. Ha telepíti, mint igaz, akkor ez a metódus a szülő és gyermek csomópontokban használt neveket adja vissza. Ellenkező esetben csak a szülőcsomópontban használt névtereket találja meg.

Most ismételheti a nyelvek listáját, így:

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

foreach ($languages> -> lang mint $lang ) (
$dc = $lang -> gyermek ($ns [ "dc" ] ) ;
printf (
"

%s megjelent itt: %d, és %s hozta létre.

" ,
$lang["név"] ,
$lang -> megjelent ,
$dc -> alkotó
) ;
}

Esettanulmány – YouTube-videócsatorna elemzése

Nézzünk egy példát, amelytől RSS-hírcsatorna érkezik YouTube csatornaés megjeleníti az összes videó linkjét. Ehhez vegye fel a kapcsolatot az alábbi címen:

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

Az URL az adott csatorna legújabb videóinak listáját adja vissza XML formátumban. Elemezzük az XML-t, és minden videóhoz megkapjuk a következő információkat:

  • Link a videóhoz
  • Miniatűr
  • Név

Kezdjük az XML keresésével és betöltésével:

$channel = "Csatornanév" ;
$url = "http://gdata.youtube.com/feeds/api/users/". $csatorna. "/feltöltések" ;
$xml = file_get_contents ($url ) ;

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

Ha megnézed az XML feedet, láthatod, hogy több elem is van benne. entitás, amelyek mindegyike részletes információkat tárol a csatorna adott videójáról. De csak képek miniatűröket, videó címét és címét használjuk. Ez a három elem az elem gyermeke csoport, ami viszont gyermeke belépés:

>

>



Cím... >

>

>

Csak végigmegyünk az összes elemen belépés, és mindegyikhez kinyerjük a szükséges információkat. vegye figyelembe, hogy játékos, miniatűrÉs cím a média névtérben vannak. Így az előző példában leírtak szerint kell eljárnunk. A neveket a dokumentumból kapjuk, és a névteret használjuk, amikor az elemekre hivatkozunk.

foreach ($feed -> bejegyzés mint $entry ) (
$group = $bejegyzés -> gyermek ($ns [ "media" ] ) ;
$csoport = $csoport -> csoport ;
$thumbnail_attrs = $csoport -> thumbnail [ 1 ] -> attribútumok () ;
$image = $thumbnail_attrs [ "url" ] ;
$lejátszó = $csoport -> játékos -> attribútumok () ;
$link = $lejátszó["url"] ;
$cím = $csoport -> cím ;
printf ( "

" ,
$lejátszó , $kép , $cím ) ;
}

Következtetés

Most, hogy tudja, hogyan kell használni SimpleXML Az XML adatok elemzéséhez fejlesztheti készségeit a különböző XML feedek különböző API-kkal történő elemzésével. Fontos azonban észben tartani, hogy a SimpleXML a teljes DOM-ot beolvassa a memóriába, így ha nagy adatkészletet elemez, elfogyhat a memória. Ha többet szeretne megtudni a SimpleXML-ről, olvassa el a dokumentációt.


Ha kérdése van, kérjük, használja a mi

Jelölőkönyvtár XML-feldolgozáshoz PHP használatával

A PHP 5-ös verziója bemutatja a SimpleXML-t, egy új alkalmazásprogramozási felületet (API) az XML olvasásához és írásához. SimpleXML kiterjesztések, mint pl

$doc->rss->channel->item->title

válasszon elemeket a dokumentumból. Mindaddig, amíg jó elképzelése van a dokumentum szerkezetéről, ezeket a kifejezéseket könnyű megírni. Ha azonban nem tudja pontosan, hol jelennek meg az érdeklődésre számot tartó elemek (mint például a Docbook, HTML és hasonlók esetében szöveges dokumentumok), a SimpleXML XPath kifejezéseket használhat ezen elemek megtalálásához.

A SimpleXML használatának első lépései

Képzeld el, mit szeretnél létrehozni PHP oldal, amely az RSS-hírcsatornát HTML-kóddá alakítja. RSS a fő XML formátum több forrásból származó tartalom közzétételéhez. A dokumentum gyökéreleme az rss , amely egyetlen csatornaelemet tartalmaz. A csatornaelem metaadatokat tartalmaz a tartalomról, beleértve a címet, a nyelvet és az URL-t. Ezenkívül számos szövegelemet tartalmaz az elemelemekbe ágyazva. Minden elemelemhez tartozik egy linkelem, amely egy URL-t vagy címet vagy leírást (általában mindkettőt) tartalmaz, amely olvasható szöveget tartalmaz. A névterek nem használatosak. Természetesen az RSS-ről még sok mindent el lehet mondani, de e cikk céljaira az információ elegendő. tipikus példát mutat be néhány tájékoztató üzenettel.

Listázás 1. RSS feed
Mokka mit Schlag http://www.elharo.com/blog hu Penn Station: Eltűnt, de nem felejtve A régi New York-i Penn Stationt még születésem előtt lebontották. Ezeket a képeket elnézve ez tévedésnek tűnik. A jelenlegi oldal működőképes, de nem több; valójában csak néhány irodatorony és földalatti folyosó, amelyek nem különösebben érdekesek vagy gyönyörűek. Az új Madison Square... http://www.elharo.com/blog/new-york/2006/07/31/penn-station Személyes Elliotte Harold számára Vannak, akik nagyon kellemetlen spamszűrőket használnak, amelyek megkövetelik valamilyen véletlenszerű karakterlánc beírását a tárgyban, például az E37T, hogy átjusson. Mondanom sem kell, hogy sem én, sem a legtöbb ember nem vesz részt a kommunikációban ezekkel a paranoiásokkal. Erősen túlreagálják a spam problémát. Én személy szerint nem... http://www.elharo.com/blog/tech/2006/07/28/personal-for-elliotte-harold/

Készítsünk egy PHP-oldalt, amely minden RSS-hírcsatornát HTML-ként formázik. a leendő oldal szerkezetét mutatja.

Lista 2. Statikus struktúra PHP kódhoz
<?php // Заголовок будет читаться из RSS ?>

XML dokumentum elemzése

Az első lépés az XML dokumentum elemzése és egy változóban való tárolása. Ehhez csak egy kódsort kell írni, amely átadja az URL-t a simplexml_load_file() függvénynek:

$rss = simplexml_load_file("http://partners.userland.com/nytRss/nytHomepage.xml");
Figyelem

Az itt használt séma veszélyesen messze van az optimálistól. Tényleg nem szabad letöltenem és elemezni az RSS-hírcsatornát minden alkalommal, amikor az oldalt meglátogatják. Ez lelassítja az oldal olvasóit, és potenciális szolgáltatásmegtagadást jelent az általam letöltött RSS-hírcsatornák számára, mivel a legtöbbjük körülbelül óránkénti egyszeri maximális frissítési sebességet állít be. A probléma valódi megoldása a gyorsítótár vagy a létrehozás HTML oldalak vagy RSS-hírcsatornákat, vagy mindkettőt. Ez a probléma azonban ellentétes SimpleXML használatával könyvtárak, úgyhogy itt szépítek egy kicsit.

Ehhez a példához vettem egy oldalt a Userland csatornáról New York Times a http://partners.userland.com/nytRss/nytHomepage.xml oldalon. Természetesen használhat bármilyen más URL-t egy másik RSS-hírcsatornához.

Vegye figyelembe, hogy a simplexml_load_ név ellenére fájlt() , ennek a funkciónak elemeznie kell az XML-dokumentumot a távoli HTTP URL-címen. De nem ez az egyetlen meglepetés ebben a funkcióban. A függvény visszatérési értéke, amelyet itt a $rss változóban tárolunk, nem mutat a teljes dokumentumra, ahogyan azt más API-kkal kapcsolatos tapasztalatok alapján elvárhatjuk, mint pl. Objektummodell dokumentum (DOM). Inkább a dokumentum gyökérelemére mutat. A dokumentum prológjában és epilógusában található tartalom nem érhető el a SimpleXML-ből.

A csatorna nevének megkeresése

A teljes csatorna neve (ellentétben a csatorna egyes szövegrészeinek címeivel) a csatornaelem cím gyermekelemében található, amely az rss gyökérelemből származik. Ezt a fejlécet úgy töltheti be, mintha az XML dokumentum csak egy mezőt tartalmazó rss objektum szerializált formája lenne csatorna, aminek viszont lenne egy mezője cím. A szokásos PHP objektum referencia szintaxist használva ez az utasítás megtalálja a fejlécet:

$cím = $rss->csatorna->cím;

Ha megtalálta a címet, hozzá kell adnia a hétvégéhez HTML adatok. Könnyű megtenni: ismételje meg a $title változót:

<?php echo $title; ?>

Ez a sor az elem karakterlánc-értékét adja ki, de nem a teljes elemet. Vagyis a szöveg rögzítve van, de a címkék nem.

Akár teljesen elhagyhatja a $title köztes változót is:

<?php echo $rss->csatorna->cím; ?>

Mivel ez az oldal sok helyen újra felhasználja ezt az értéket, kényelmesebbnek találom leíró című változóként tárolni.

Iteráció elemeken keresztül

$rss->csatorna->elem

A csatornák azonban általában egynél több elemet tartalmaznak. Vagy lehet, hogy egyáltalán nem is léteznek. Ennek megfelelően ez az utasítás egy tömböt ad vissza, amelyet egy for-each ciklussal iterálhat:

foreach ($rss->channel->item mint $item) ( echo "

". $item->title."

"; visszhang"

". $item->description."

"; }
Listing 3. Egyszerű, de teljes program PHP RSS olvasó
csatorna->cím; ?> <?php echo $title; ?>

csatorna->elem mint $elem) ( echo "

link. "">".$item->title. "

"; visszhang"

". $item->description."

"; } ?>

Ennyi kell az íráshoz egy egyszerű program RSS olvasók PHP-ben - Több HTML karakterláncokés néhány PHP karakterláncok. Szóközök nélkül, összesen 20 sor. Természetesen nem ez a leginkább funkciókban gazdag, optimalizált vagy megbízható fejlesztés. Lássuk, mit tehetünk ennek javítása érdekében.

Hiba a feldolgozásban

Nem minden RSS-hírcsatorna olyan jól formázott, mint kellene. Az XML specifikáció megköveteli a processzoroktól, hogy azonnal leállítsák a dokumentumok feldolgozását, amint formális hibát észlel, és a SimpleXML megfelel az XML feldolgozó programnak. Ez azonban nem sokat segít, ha hibát talál. Általában a program figyelmeztetést ír a php hibafájlba (de nincs részletes hibaüzenet), a simplexml-load-file() függvény pedig hibát. Ha nem biztos abban, hogy az elemezni kívánt fájl jól felépített-e, ellenőrizze, hogy van-e ez a hiba, mielőtt a fájl adatait felhasználná, amint az itt látható.

4. lista. Óvakodjon a hibás beviteltől
xpath("//title") mint $title) ( echo "

". $title."

"; ) ) else ( echo "Hoppá! A bemenet hibás!"; ) ?>

Egy másik gyakori hiba akkor fordul elő, ha egy dokumentum jól formázott, de nem tartalmazza a várt elemeket ott, ahol azt várná. Mi történik például egy ilyen $doc->rss->channel->item->title kifejezéssel, ha az elemcsoportnak nincs címe (ahogy ez a száz leggyakoribb RSS-hírfolyam közül legalább egynél megtörténik)? A legegyszerűbb megközelítés az, ha egy függvény visszatérési értékét mindig adattömbként kezeljük, és ciklusba csomagoljuk. Ebben az esetben védve van attól, hogy több vagy kevesebb elem legyen, mint amire számítottál. Ha azonban tudja, hogy az első elemet szeretné a dokumentumban, még akkor is, ha egynél több van, lekérdezheti egy nulla alapú indexen keresztül. Például az első elemcsoport címének kéréséhez írja be:

$doc->rss->channel->item->title

Ha az elemek első csoportja hiányzik, vagy nincs neve, akkor a rendszer ugyanúgy kezeli, mint a többi csoportot. megállapított keret index, be PHP tömb. Vagyis az eredmény null, ami üres karakterláncsá változik, amikor megpróbálja beilleszteni a HTML kimeneti kódba.

Az olyan váratlan formátumok felismerése és elutasítása, amelyekkel nincs felkészülve, általában az érvényesítő XML-elemző tartománya. A SimpleXML azonban nem tud érvényesíteni DTD-sablon (DTD) vagy adatséma alapján. Csak a formai helyességet ellenőrzi.

Hogyan kell dolgozni a névtérrel

Manapság sok webhely áttér az RSS-ről az Atomra. példát mutat be az Atomban. Ez a dokumentum sok tekintetben megegyezik az RSS példával. Itt azonban több metaadat található, és a gyökérelem a feed az rss helyett. A hírcsatorna elemben elemek helyett listák vannak. A tartalom elem helyettesíti a leírás elemet. Ennél is fontosabb, hogy egy Atom-dokumentum névteret használ, míg az RSS nem. Így egy Atom dokumentum valódi, vágatlan bővíthető HTML (XHTML) tartalmat adhat ki.

Lista 5. Dokumentum az Atomban
2006-08-04T16:00:04-04:00 http://www.cafeconleche.org/ Cafe con Leche XML hírek és források Copyright 2006 Elliotte Rusty Harold Steve Palmer közzétette a Vienna 2.1 béta verzióját <a href="https://sukachoff.ru/hu/ustrojjstva/naznachenie-diagramm-uml-instrumenty-dlya-risovaniya-uml-diagramm-open/">nyílt forráskód</a> RSS/Atom kliens Mac OS X rendszerhez.

Steve Palmer közzétette a Vienna 2.1 béta verzióját, amely egy nyílt forráskódú RSS/Atom kliens Mac OS X rendszerhez. A Vienna az első olvasó, akit "elfogadhatónak találtam a mindennapi használatra; nem nagyszerű, de elég jó. (Természetesen a "jó" szabványaim elég magasak.) A 2.1 a felhasználói felület fejlesztésére összpontosít egy egységes elrendezéssel, amely lehetővé teszi több cikk görgetését, cikkszűrést (például az összes cikk elolvasását az utolsó frissítés óta), a mappák kézi átrendezését, egy új információs ablakot, és továbbfejlesztett tömörített elrendezés.

http://www.cafeconleche.org/#August_1_2006_25279 2006-08-01T07:01:19Z
Matt Mullenweg kiadta a Wordpress 2.0.4-et, egy PHP és MySQL alapú blogmotort.

Matt Mullenweg kiadta a Wordpress 2.0.4-et, egy PHP és MySQL alapú blogmotort. A 2.0.4 különféle biztonsági réseket szúr be, amelyek többnyire bővítményeket tartalmaznak.

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

Bár az elemnevek megváltoztak, az Atom dokumentumaiban a SimpleXML-lel való munka alapvető megközelítése ugyanaz, mint az RSS-nél. Az egyetlen különbség az, hogy meg kell adni a névteret, pl. Uniform Resource Identifier (URI), ha egy elemet névvel kér, ugyanúgy helyi név. Ez egy kétlépéses folyamat: először kérdezze le a gyermekelemeket adott teret neveket úgy, hogy az URI névteret átadja a children() függvénynek. Ezután keressen le a megfelelő helyi névvel rendelkező elemeket a névtérben. Képzelje el, hogy először az Atom hírcsatornát töltötte be a $feed változóba, például:

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

Ez a két sor most megtalálja a cím elemet:

$gyerekek = $feed->children("http://www.w3.org/2005/Atom"); $cím = $gyerek->cím;

Ezt a kódot egyetlen utasításba sűrítheti, ha akarja, bár a karakterlánc kissé hosszú lesz. A névterek összes többi elemét ugyanígy kell kezelni. mutatja teljes oldal PHP, amely egy elnevezett Atom cső fejléceit jeleníti meg.

Lista 6. Egyszerű PHP Atom fejlécolvasó
gyerekek ("http://www.w3.org/2005/Atom"); $cím = $gyerek->cím; ?> <?php echo $title; ?>

belépés; foreach ($entries mint $bejegyzés) ( $részletek = $entry->children("http://www.w3.org/2005/Atom"); echo "

". $részletek->cím."

"; } ?>

Vegyes tartalom

Miért csak a fejléceket jelenítettem meg ebben a példában? Mert az Atomban bármely lista tartalma tartalmazhatja a töredék teljes szövegét és nem csak magát a szöveget, hanem a teljes jelölést is. ez - narratív szerkezet: a szavak egy sorban arra valók, hogy az emberek olvassák. Mint a legtöbb ilyen jellegű adatnál, itt is vegyes a tartalom. Az XML már nem egyszerűsödik, így a SimpleXML megközelítés kezd akadozni. Vegyes tartalommal nem tud megfelelően működni, és ez az adatkihagyás sok esetben kizárja a felhasználást.

Egy dolgot tehet, de ez csak részleges megoldás a problémára. Csak azért fog működni, mert a tartalomelem valódi XHTML-t tartalmaz. Ezt az XHTML-t elemzetlenként másolhatja forrás közvetlenül a végtermékhez az asXML() függvény használatával, például az alábbiak szerint:

visszhang"

". $részletek->tartalom->asXML(). "

";

Az eredmény valami hasonló lesz.

Lista 7. XML kimenet

Nikolai Grigoriev kiadta az SVGMath 0.3-at, egy prezentációs MathML formázót, amely tiszta Python nyelven írt SVG-t készít, és MIT licenc alatt tesz közzé. Grigorjev szerint "Az új verzió több névteres dokumentumokkal is működhet (pl. XSL-FO vagy XHTML dokumentumban az összes MathML részfát SVG-re cseréli); a konfiguráció rugalmasabb lett, és számos hiba kijavított. Van egy stíluslap is az eredményül kapott SVG-kép függőleges helyzetének beállításához XSL-FO-ban."

Ez nem tiszta XHTML. A tartalomelem a dokumentum Atomjából származik, és jobb, ha nem rendelkezik vele. Még rosszabb, hogy rossz névtérbe lép be, így nem lehet felismerni, hogy mi az. Szerencsére ez az extra elem a gyakorlatban nem sokat árt, mert a webböngészők egyszerűen figyelmen kívül hagyják az általuk nem felismert címkéket. A kész dokumentum hibás, de ez nem igazán számít. Ha nagyon zavar, semmisítse meg karakterlánc-műveletekkel, például:

$leírás = $részletek->tartalom->asXML(); $tags = array(" ", ""); $notags = array("", ""); $leírás = str_replace($tags, $notags, $description);

Ha egy kicsit robusztusabbá szeretné tenni a kódot, használjon reguláris kifejezést ahelyett, hogy azt feltételezné, hogy a kezdőcímke pontosan a fent látható. Különösen sok lehetséges attribútumot számíthat ki:

// zárócímke fix alakú, így könnyen lecserélhető a $description = str_replace("", "", $description); // távolítsa el a kezdő címkét, beleértve az attribútumokat és a szóközt, ha lehetséges $description = ereg_replace(" ]*>", "", $leírás);

A kód még ezzel a módosítással is kiadhat megjegyzéseket, számítási parancsokat és CDATA-darabokat. Akárhogy is, levágod, bár attól tartok, ez már nem olyan egyszerű. A vegyes tartalom egyszerűen átlépi azokat a határokat, amelyeken belül a SimpleXML-t úgy tervezték, hogy működjön.

XPath

Az olyan kifejezések, mint a $rss->channel->item->title, csak akkor nagyszerűek, ha pontosan tudod, hogy milyen elemek találhatók a dokumentumban, és pontosan hol vannak. Ezt azonban nem mindig tudod. Például az XHTML-ben a fejléc elemei (h1 , h2 , h3 stb.) a body , div , table és számos más elem gyermekei lehetnek. Ezenkívül a div , table , blockquote és egyéb elemek többször egymásba ágyazhatók. Sok kevésbé specifikus felhasználási esetben egyszerűbb XPath kifejezéseket használni, például //h1 vagy //h1 . A SimpleXML rendelkezik ezzel a készlettel funkcionalitás az xpath() függvényen keresztül.

Lista 9. XPath használata névterekkel
$atom = simplexml_load_file("http://www.cafeconleche.org/today.atom"); $atom->registerXPathNamespace("atm", "http://www.w3.org/2005/Atom"); $címek = $atom->xpath("//atm:cím"); foreach ($titles mint $title) ( echo "

". $title."

"; }

Egy utolsó figyelmeztetés: PHP-ben az XPath meglehetősen lassú. Az oldal betöltése egy pillanattól néhány másodpercig tarthat, amikor erre az XPath kifejezésre váltok, még egy betöltetlen helyi szerveren is. Ha ezeket a trükköket használja, akkor valamilyen gyorsítótárat kell használnia az intelligens működéshez. Minden oldal dinamikus generálása egyszerűen nem fog működni.

Következtetés

A SimpleXML hasznos kiegészítője a PHP fejlesztői eszköztárának, mindaddig, amíg nem kell vegyes tartalommal dolgozni. Fedezi nagyszámú használati esetek. Ez különösen jól működik egyszerű rekordok formájában. Mindaddig, amíg a dokumentum nem túl mély, túl összetett és nem tartalmaz vegyes tartalmat, a SimpleXML sokkal egyszerűbb, mint a DOM-alternatívája. Az is segít, ha előre ismeri a dokumentum szerkezetét, bár az XPath használata sokat segíthet ezen a követelményen. A vegyes tartalom érvényesítésének és támogatásának hiánya zavaró, nem mindig akadály. Sok egyszerű formátum nem tartalmaz vegyes tartalmat, és sok esetben csak nagyon kiszámítható adatformátumokat használnak. Ha ez jellemzi a munkáját, nyugodtan próbálja ki a SimpleXML-t. A hibákra való kis odafigyeléssel és a gyorsítótár-hangolással a teljesítményproblémák minimálisra csökkentése érdekében a SimpleXML robusztus, hibatűrő, XML-feldolgozó eszköz lehet a PHP-n belül.

A SimpleXML meglehetősen egyszerű és ugyanakkor meglehetősen hatékony módja az xml-adatok feldolgozásának. A simpleXML lényege, hogy az összes XML kódot PHP objektummá alakítják, ami meglehetősen egyszerűvé teszi a vele való munkát. SimpleXML-lel végzett munka során minden adatnak UTF-8 kódolásúnak kell lennie.

A PHP objektummá való átalakítás leggyakrabban a függvény segítségével történik simplexml_load_file, az alábbiakban példákat talál a vele való munkavégzésre. Ezenkívül használhatja a funkciót simplexml_load_string, PHP objektum létrehozása XML karakterláncból

Először hozzunk létre egy xml fájlt

A következő példában csak a második autó ára jelenik meg.

A teljes xml-kód egyszerre vagy egyetlen csomópont megjelenítéséhez az asXML() metódust használjuk.

A simpleXML támogatja az XPath nyelv használatával történő címzést is. A következő példa kijelöli az összes "év" csomópontot, és visszaadja ezek tömbjét.

Az elemértékek cseréje egyszerűen egy érték hozzárendelésével történik

A gyermekcsomópontokkal rendelkező csomópontok cseréjekor ügyelni kell arra, hogy az összes gyermekcsomópont eltávolításra kerüljön.

Az előző két példában az xml adatok találhatók véletlen hozzáférésű memória, de nem voltak lemezre írva. A fájlban lévő adatok felülírásához használja a funkciót file_put_contents()

A Simplexml_import_dom() függvény segítségével a simpleXML és a Dom integrálása is lehetséges

Ez a példa bemutatja, hogyan kaphatja meg az elemattribútumok értékét.

SimpleXMLElement->asXML

SimpleXMLElement->asXML -- Egy jól formázott XML dokumentumot ad vissza

Leírás

Vegyes SimpleXMLElement->asXML()

Az asXML metódus az XML 1.0-s verziójában állít elő adatokat.

Paraméterlista
fájl név
Ha meg van adva, a metódus adatokat ír a megadott fájlba.
Visszatérési értékek
Ha fájlnév van megadva, a metódus az XML adatokat a megadott fájlba írja. Ellenkező esetben a metódus az XML-adatokat karakterláncként adja vissza.
Megjegyzések
Ha a forrásdokumentum a kódolási paraméterrel a fejlécekben megadta az XML dokumentum kódolását, akkor az asXML metódus a megadott kódolásban adja vissza az XML dokumentumot. Az XML-dokumentum kódolásának megváltoztatása a SIMPLEXML-kiterjesztés használatával nem lehetséges.
Példák
1. példa: XML kimenet

$karakterlánc =<<

szöveg
dolog


kód

XML

echo $xml->asXML(); //szövegdolog
...?>

Az asXML metódus az Xpath-al is működhet:

2. példa: Az asXML() metódus használata Xpath segítségével

// A fenti példa folytatása.
/* Keresés */
$eredmény = $xml->xpath("/a/b/c");
while(lista(, $csomópont) = every($eredmény)) (
echo $csomópont->asXML(); // szövegÉs dolog
}
?>

SimpleXMLElement->attribútumok

SimpleXMLElement->attributes -- Az elem attribútumait adja vissza.

Leírás

SimpleXMLElement simplexml_element->attributes()

Ez a függvény visszaadja a kiválasztott xml elem attribútumainak nevét és értékeit. Megjegyzés: A SimpleXML-nek van egy szabálya az iteratív tulajdonságok hozzáadására a legtöbb metódushoz. Nem ellenőrizhetők a var_dump() vagy más objektumelemző segítségével.

1. példa: XML karakterlánc értelmezése

$karakterlánc =<<
[e-mail védett]

XML
$xml = simplexml_load_string($string);
foreach($xml->users->attributes() mint $a => $b) (
echo $a,"="",$b,"\"\n";
}
?>

Ez a példa a következőt fogja kiadni:

Name="Evgen"
age="27

SimpleXMLElement->gyerekek

SimpleXMLElement->children -- Az adott elem gyermekelemeit adja vissza

Leírás

SimpleXMLElement simplexml_element->childs()

Ez a módszer megkeresi az adott elem gyermekelemeit.

Megjegyzés: A SimpleXML-nek van egy szabálya az iteratív tulajdonságok hozzáadására a legtöbb metódushoz. Nem ellenőrizhetők a var_dump() vagy más objektumelemző segítségével.

1. példa: A children() metódus használata

$xml = simplexml_load_string(
"










");
visszhang"

    ";
    foreach ($xml->childs() mint $site) (
    visszhang"
    " .$site["név"];
    foreach ($site->children() mint $subsite) (
    visszhang"
    " .$aloldal["név"];
    }
    }
    visszhang"
";
?>

Ez a példa a következőt fogja kiadni:

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

SimpleXMLElement->xpath

SimpleXMLElement->xpath – Xpath lekérdezést hajt végre XML adatokon

Leírás

SimpleXMLElement->xpath tömb (karakterlánc elérési útja)

Az xpath metódus megkeresi a SimpleXML elem gyermekelemeit, amelyek elérési útja a path paraméterben van megadva. A metódus SimpleXMLElement objektumok tömbjét adja vissza.

1. példa Xpath

$karakterlánc =<<

szöveg
dolog


kód

egyszerű



XML
$xml = simplexml_load_string($string);
/* Keresés a következő szerint */
$eredmény = $xml->xpath("/a/b/c");
foreach ($eredmény mint $csomópont) (
echo "/a/b/c:" . $csomópont. "
";
}
/* A relatív elérési utak is működnek... */
$eredmény = $xml->xpath("b/c");
foreach ($eredmény mint $csomópont) (
echo "b/c:" . $csomópont. "
";
}
?>

Ez a forgatókönyv ki fogja adni:

/a/b/c: szöveg
/a/b/c:cuccb/c:textb/c:cucc

Két eredmény ez az eset ugyanazok.

simplexml_import_dom (PHP 5)

simplexml_import_dom -- DOM objektumból létrehozott SimpleXMLElement objektumot ad vissza.

Leírás

SimpleXMLElement simplexml_import_dom(DOMNode csomópont[, string osztálynév])

Ez a funkció vesz egy DOM objektumot, és az alapján létrehoz egy SimpleXML objektumot.

Ez az új objektum egy normál SimpleXML objektumhoz hasonlóan használható.

Ha hiba történt az objektum létrehozása során, a metódus false értéket ad vissza.

1. példa DOM importálása

$dom = új domDocument;
$dom->loadXML(" php-spravka.ru");
if (!$dom) (
echo "Hiba a dokumentum elemzésekor!";
kijárat;
}
$s = simplexml_import_dom($dom);
echo $s->site->url; // php-help.ru
?>

simplexml_load_file (PHP 5)

simplexml_load_file -- Egy XML-fájlt objektummá értelmez

Leírás

Object simplexml_load_file(karakterlánc fájlnév[, karakterlánc-osztálynév[, int beállítások]])

Ez a függvény a jól formázott XML adatokkal rendelkező fájlnevet SimpleXMLElement objektummá értelmezi. Ha hibák vannak az XML adatokban, a függvény FALSE értéket ad vissza.

Használhatja az opcionális class_name paramétert a simplexml_load_file() függvényben, hogy a függvény a megadott osztály objektumát adja vissza. Ebben az esetben az osztálynak a SimpleXMLElement osztály kiterjesztésének kell lennie.

A PHP 5.1.0 és a Libxml 2.6.0 óta használhatja az opcionális opciók paramétert, amelynek specifikációját a további Libxml paraméterek írják le.

Megjegyzés: A Libxml 2 az URL-t a megfelelő formára alakítja. Azok. ha az URL-karakterláncban a b&c-t szeretné beállítani, akkor nem kell tennie:

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

A PHP 5.1.0 óta ez automatikusan megtörténik.

1. példa: XML-dokumentum értelmezése

// A test.xml fájl egy XML dokumentumot tartalmaz gyökérelemmel
// és beágyazott címelem //title.if (file_exists("teszt.xml")) (
$xml = simplexml_load_file("teszt.xml");

Var_dump($xml);
) más (
exit("Hiba a teszt.xml megnyitásakor.");
}
?>
Ez a példa a következőt adja ki: SimpleXMLElement Object(
=> Fejléc tesztelése
...
)

BAN BEN ezt a példát a cím elemet így érheti el: $xml->title.

simplexml_load_string(PHP 5)

simplexml_load_string -- Egy XML karakterláncot objektummá értelmez

Leírás

Object simplexml_load_string(string data[, string class_name[, int options]])

Ez a függvény a "helyes" XML dokumentumot veszi az adatkarakterláncban, és a SimpleXMLElement osztály egy objektumát adja vissza, amelynek tulajdonságai megegyeznek az xml dokumentum tartalmával. Ha az XML dokumentum hibás, a függvény FALSE-t ad vissza.

Használhatja az opcionális class_name paramétert, hogy a simplexml_load_string() függvény az adott osztály egy objektumát adja vissza. Ennek az osztálynak ki kell terjesztenie a SimpleXMLElement osztályt.

A PHP 5.1.0-tól és a Libxml 2.6.0-tól kezdve használhatja az opcionális beállítások paramétert is, amelynek tartalma további Libxml-paraméterekben van meghatározva.

1. példa: XML karakterlánc átalakítása

$karakterlánc =<<

Negyven Mi?
Joe
Jane



XML
$xml = simplexml_load_string($string);
var_dump($xml);
?>
Ez a példa a következőt adja ki: SimpleXMLElement Object(
=> Negyven Mi?
=> Joe
=> Jane
=>
Tudom, hogy ez a válasz – de mi a kérdés?
)

Ebben a példában használhatja a $xml->body konstrukciókat stb.

Ha hibát észlel, jelöljön ki egy szövegrészt, és nyomja meg a Ctrl + Enter billentyűket
OSSZA MEG: