XML elemzése. XML adatok elemzése Példa az xml-lel való munkára

  • Dátum: 14.05.2021

Az Extensible Markup Language XML a dokumentumok géppel olvasható formájú kódolására szolgáló szabályok összessége. Az XML az internetes adatcsere népszerű formátuma. A tartalmukat gyakran frissítő webhelyek, például híroldalak vagy blogok, gyakran biztosítanak XML-hírcsatornát, hogy a külső programok tudatában legyenek a tartalomváltozásoknak. Az XML adatok küldése és elemzése gyakori feladat a hálózati alkalmazásoknál. Ez a lecke elmagyarázza, hogyan lehet XML-dokumentumokat elemezni és felhasználni az adataikat.

Elemző kiválasztása

Csatornaelemzés

A hírcsatorna elemzésének első lépése annak eldöntése, hogy mely adatmezők érdeklik. Az elemző kibontja a megadott mezőket, és figyelmen kívül hagy minden mást.

Íme egy hírcsatorna-részlet, amelyet a példaalkalmazásban fogunk megvizsgálni. A StackOverflow.com minden bejegyzése bejegyzéscímkeként jelenik meg a hírfolyamban, amely több beágyazott címkét tartalmaz:

android címkével ellátott legújabb kérdések - Stack Overflow ... ... http://stackoverflow.com/q/9439999 0 Hol van az adatállományom? szikla2310 http://stackoverflow.com/users/1128925 2012-02-25T00: 30: 54Z 2012-02-25T00: 30: 54Z

Van egy alkalmazásom, amelyhez adatfájl szükséges...

... ...

A példaalkalmazás adatokat nyer ki a bejegyzés címkéjéből, valamint annak cím, link és összefoglaló alcímkéiből.

Az elemző példányosítása

A következő lépés az elemző példányosítása és az elemzési folyamat elindítása. Ez a kódrészlet inicializálja az elemzőt, hogy ne kezelje a névtereket, és a megadott InputStream-et használja bemenetként. Az elemzési folyamat a nextTag () meghívásával indul, és meghívja a readFeed () metódust, amely lekéri és feldolgozza az alkalmazást érdeklő adatokat:

Nyilvános osztály StackOverflowXmlParser (// Nem használunk névtereket private static final String ns = null; public List parse (InputStream in) XmlPullParserException, IOException (próbáld meg (XmlPullParser parser = Xml.newPullParser ();); parser.set ); parser.setInput (in, null); parser.nextTag (); return readFeed (elemző);) végül (in.close ();)) ...)

Csatorna kivonása

A readFeed () metódus végzi el az adatfolyam kezelésének tényleges munkáját. Az "entry" címkével jelölt elemek jelentik a rekurzív csatornafeldolgozás kiindulópontját. Ha a következő címke nem belépési címke, akkor a rendszer kihagyja. A teljes hírcsatorna rekurzív feldolgozása után a readFeed () egy listát ad vissza, amely tartalmazza a hírfolyamból beolvasott bejegyzéseket (beleértve a beágyazott adatelemeket is). Ezt a listát az elemző visszaadja.

A Private List readFeed (XmlPullParser elemző) az XmlPullParserException, IOException (listabejegyzések = new ArrayList (); parser.require (XmlPullParser.START_TAG, ns, "feed"); while (parser.next ()! = XmlPullParser.END) getEventType ()! = XmlPullParser.START_TAG) (folytatás;) String name = parser.getName (); // Az if (name.equals ("bejegyzés")) bejegyzési címkével kezdődik (entries.add ( readEntry (elemző) ));) else (kihagyja (elemző);)) adja vissza a bejegyzéseket;)

XML elemzése

Az XML-hírcsatorna elemzésének lépései a következők:

Ez a részlet megmutatja, hogy az elemző hogyan elemzi a bejegyzést, a címet, a hivatkozást és az összefoglalót.

Nyilvános statikus osztálybejegyzés (nyilvános végleges Karakterlánc címe; nyilvános végleges Karakterlánc hivatkozás; nyilvános végleges Karakterlánc-összefoglaló; privát bejegyzés (String címe, Karakterlánc-összefoglaló, Karakterlánc hivatkozás) (this.title = cím; this.summary = összegzés; this.link = link ;)) // Egy bejegyzés tartalmát elemzi. Ha címet, összefoglalót vagy hivatkozási címkét talál, adja át // a megfelelő "olvasási" metódusuknak a feldolgozáshoz. Ellenkező esetben kihagyja a címkét. private Entry readEntry (XmlPullParser parser) XmlPullParserException, IOException (parser.require (XmlPullParser.START_TAG, ns, "entry"); String title = null; String summary = null; String link = null; while (parser.next ())! = XmlPullParser.END_TAG) (if (parser.getEventType ()! = XmlPullParser.START_TAG) (folytatás;) Karakterlánc neve = parser.getName (); if (name.equals ("title")) (title = readTitle (elemző) ;) else if (name.equals ("összefoglaló")) (összegzés = readSummary (parser);) else if (name.equals ("link")) (link = readLink (elemző);) else (skip (elemző)) ;)) return new Entry (cím, összefoglaló, link);) // Feldolgozza a címcímkéket a hírfolyamban. private String readTitle (XmlPullParser elemző) IOException, XmlPullParserException (parser.require (XmlPullParser.START_TAG, ns, "title"); String title = readText (parser); parser.require (XmlPullParser.END title;") kifejezést adja vissza; ) // Feldolgozza a hírfolyamban lévő linkcímkéket. A private String readLink (XmlPullParser értelmező) IOException, XmlPullParserException (String link = ""; parser.require (XmlPullParser.START_TAG, ns, "link"); String tag = parser.getName (); String relType = parser.getllValue , "rel"); if (tag.equals ("link")) (if (relType.equals ("alternate")) (link = parser.getAttributeValue (null, "href"); parser.nextTag ();) ) parser.require (XmlPullParser.END_TAG, ns, "link"); return link;) // Feldolgozza az összefoglaló címkéket a hírfolyamban. private String readSummary (XmlPullParser értelmező) IOException, XmlPullParserException (parser.require (XmlPullParser.START_TAG, ns, "summary"); String summary = readText (parser); parser.require (XmlPullParser, "END_TAG " summary return summary ";); ) // A cím és az összefoglaló címkék szöveges értékeit kivonja. private String readText (XmlPullParser értelmező) IOException, XmlPullParserException (String result = ""; if (parser.next () == XmlPullParser.TEXT) (eredmény = parser.getText (); parser.nextTag ();)) eredményt ad; )...)

Kihagyja azokat a tárgyakat, amelyekre nincs szüksége

A fent leírt XML-elemzési lépések egyikében az elemző kihagyja azokat a címkéket, amelyekre nem vagyunk kíváncsiak. Alább látható a skip () metódus értelmező kódja:

A privát void kihagyás (XmlPullParser értelmező) XmlPullParserException, IOException (if (parser.getEventType ()! = XmlPullParser.START_TAG) (dobja új IllegalStateException ();) int mélység = 1; míg (depth! = 0)) (kapcsoló következő ()) (XmlPullParser eset.END_TAG: mélység--; törés; XmlPullParser eset.START_TAG: mélység ++; törés;)))

Ez így működik:

  • A metódus kivételt dob, ha az aktuális esemény nem START_TAG.
  • Felhasználja START_TAG és az összes eseményt END_TAG-ig.
  • Annak érdekében, hogy a megfelelő END_TAG-nál álljon meg, és ne az eredeti START_TAG utáni első találkozási címkénél, nyomon követi a beágyazási mélységet.

Így, ha az aktuális elem beágyazott elemeket tartalmaz, a mélység értéke nem lesz 0 mindaddig, amíg az elemző fel nem dolgozott minden eseményt az eredeti START_TAG és a megfelelő END_TAG között. Vegyük például, hogyan hibázik az analizátor egy elem, amely 2 beágyazott elemet tartalmaz, és :

  • A while cikluson való első lépésben a következő címke, amellyel az elemző találkozik azután ez START_TAG erre való
  • A while ciklus második lépésében a következő címke, amellyel az elemző találkozik, az END_TAG
  • A while ciklus harmadik lépésében a következő címke, amellyel az elemző találkozik, a START_TAG ... A mélység értéke 2-re nő.
  • A while ciklus negyedik lépésében a következő címke, amellyel az elemző találkozik, az END_TAG... A mélység értéke 1-re csökken.
  • A while ciklus ötödik és utolsó áthaladásakor a következő címke, amellyel az elemző találkozik, a END_TAG... A mélység 0-ra csökken, ami azt jelzi a tétel sikeresen kimaradt.

XML adatfeldolgozás

A példaalkalmazás fogad és elemzi egy XML feedet egy AsyncTask-ba. A feldolgozás a fő felhasználói felületen kívül történik. A feldolgozás befejeztével az alkalmazás frissíti a felhasználói felületet a fő tevékenységben (NetworkActivity).

Az alábbi részletben a loadPage () metódus a következőket teszi:

  • Inicializál egy karakterlánc-változót, amelynek URL-értéke XML-hírcsatornára mutat.
  • Ha a felhasználói beállítások és a hálózati kapcsolat lehetővé teszi, meghívja az új DownloadXmlTask () alkalmazást. Végrehajtás (url). Ez létrehoz egy új DownloadXmlTask ​​objektumot (AsyncTask alosztály), és végrehajtja az execute () metódust, amely letölti és elemzi a csatornát, és egy karakterlánc eredményt ad vissza, amely megjelenik a felhasználói felületen.
public class NetworkActivity kiterjeszti a tevékenységet (public static final String WIFI = "Wi-Fi"; public static final String ANY = "Any"; privát statikus végső karakterlánc URL = "http://stackoverflow.com/feeds/tag?tagnames=android&sort = legfrissebb "; // Van-e Wi-Fi kapcsolat. Privát statikus logikai érték wifiConnected = false; // Van-e mobil kapcsolat refreshDisplay = true; public static String sPref = null; ... // Az AsyncTask segítségével tölti le az XML feedet a stackoverflow.com webhelyről. public void loadPage () (if ((sPref.equals (ANY)) && (wifiConnected || mobileConnected) )) (new DownloadXmlTask (). execute (URL);) else if ((sPref.equals (WIFI)) && (wifiConnected)) (new DownloadXmlTask (). execute (URL);) else (// hibát mutat))
  • A doInBackground () végrehajtja a loadXmlFromNetwork () metódust. Paraméterként adja át a csatorna URL-jét. A loadXmlFromNetwork () metódus fogadja és feldolgozza a csatornát. Amikor befejezi a feldolgozást, visszaadja a kapott karakterláncot.
  • onPostExecute () veszi a visszaadott karakterláncot, és megjeleníti a felhasználói felületen.
// Az AsyncTask megvalósítása az XML-hírcsatorna letöltéséhez a stackoverflow.com webhelyről. privát osztály A DownloadXmlTask ​​​​kibővíti az AsyncTask szolgáltatást (@Felülbírálja a védett karakterláncot doInBackground (String ... urls) (próbálja meg (vissza a 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 eredménye) (setContentView (R.layout.main); // Megjeleníti a HTML karakterláncot a felhasználói felületen egy WebView WebView WebView myWebView = (WebView) findViewById (R.id.webview); myWebView.loadData (eredmény, "text / html", null);))

Az alábbiakban látható a loadXmlFromNetwork () metódus, amelyet a DownloadXmlTask ​​programból hívnak meg. A következőket teszi:

  1. Létrehozza a StackOverflowXmlParser példányát. Ezenkívül változókat hoz létre a listabejegyzés objektumokhoz (bejegyzésekhez), valamint a címhez, URL-hez és összefoglalóhoz, hogy tárolja az XML-hírcsatornából lekért értékeket ezekhez a mezőkhöz.
  2. Meghívja a downloadUrl-t (), amely letölti a csatornát, és InputStreamként adja vissza.
  3. A StackOverflowXmlParser segítségével elemzi az InputStream elemet. A StackOverflowXmlParser feltölti a listabejegyzéseket a feedből származó adatokkal.
  4. Feldolgoz egy bejegyzéslistát, és egyesíti a feedadatokat HTML-jelöléssel.
  5. A fő tevékenység felhasználói felületén megjelenő HTML-karakterláncot adja vissza, az AsyncTask az onPostExecute () metódusban.
// XML-t tölt fel a stackoverflow.com webhelyről, elemzi, és kombinálja a // HTML-jelöléssel. HTML karakterláncot ad vissza. Privát karakterlánc bejegyzések = null; String title = null; String url = null; Karakterlánc összegzése = null; Calendar rightNow = Calendar.getInstance (); DateFormat formatter = new SimpleDateFormat ("MMM nn h: mma"); // Ellenőrzi, hogy a felhasználó beállított-e összefoglaló szöveget a beállításban SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences (this); boolean pref = sharedPrefs.getBoolean ("summaryPref", false); StringBuilder htmlString = új StringBuilder (); htmlString.append ("

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

"); htmlString.append (" "+ getResources (). getString (R.string.updated) +" "+ formatter.format (rightNow.getTime ()) +""); try (stream = downloadUrl (urlString); bejegyzések = stackOverflowXmlParser.parse (folyam); // Győződjön meg arról, hogy az InputStream be van zárva, miután az alkalmazás // befejezte a használatát.) Végül (if (stream! = null) (stream.close ();)) // A StackOverflowXmlParser egy listát (úgynevezett "bejegyzéseket") ad vissza az Entry objektumokról. // Minden Entry objektum egyetlen bejegyzést jelent az XML feedben. // Ez a szakasz feldolgozza a bejegyzések listáját az egyes elemek kombinálásához. bejegyzés HTML-jelöléssel. // Minden bejegyzés hivatkozásként jelenik meg a felhasználói felületen, amely opcionálisan // tartalmaz egy szöveges összefoglalót. for (Bejegyzés: bejegyzések) (htmlString.append ("

"+ bejegyzés.cím +"

"); // Ha a felhasználó úgy állítja be az összefoglaló szöveget, // hozzáadja a megjelenítéshez. If (pref) (htmlString.append (entry.summary);)) adja vissza a htmlString.toString ();) // Adott egy URL karakterlánc-reprezentációja, létrehoz egy kapcsolatot, és // bemeneti adatfolyamot kap ; conn.setReadTimeout (10000 / * ezredmásodperc * /); conn.setConnectTimeout (15000 / * ezredmásodperc * /); conn.setRequestMethod ("GET"); conn.setDoInput (true); // Elindítja a lekérdezést conn.connect ( ); return conn.getInputStream ();)

Az XML elemzése lényegében egy XML dokumentum bejárását és a megfelelő adatok visszaadását jelenti. Noha egyre több webszolgáltatás ad vissza adatokat JSON formátumban, a legtöbb továbbra is XML-t használ, ezért fontos az XML-elemzés elsajátítása, ha a rendelkezésre álló API-k teljes skáláját szeretné használni.

A kiterjesztés használata SimpleXML a PHP 5.0-ban hozzáadott PHP-ben az XML-lel való munkavégzés nagyon egyszerű és egyértelmű. Ebben a cikkben megmutatom, hogyan kell ezt megtenni.

A használat alapjai

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 függvények segítségével simplexml_load_file () vagy simplexml_load_string ()... Ahogy a függvények neve is sugallja, az előbbi az XML-t fájlból, az utóbbi pedig egy karakterláncból tölti be.

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 $ nyelvek változóban van tárolva. Használhat funkciókat var_dump () vagy print_r () ha úgy tetszik, részleteket kaphat a visszaküldött tárgyról.

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

Ez az XML tartalmazza a gyökérelemet nyelvek, amelyen belül három elem található lang. A tömb minden eleme egy elemnek felel meg lang az XML dokumentumban.

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

$ nyelvek -> lang [0] -> megjelent;
$ nyelvek -> lang [0] -> alkotó;

Nagyon egyszerű a nyelvek listájának megjelenítése és tulajdonságaik megjelenítése szabványos hurok segítségével, mint pl az egyes.

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

Figyelje meg, hogyan jutottam el 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-jével való munka során nem egyszer találkozik 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 az 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, akkor az nem fog működni. Az elemek névtereinek olvasásához a következő megközelítések egyikét kell használnia.

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

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

Módszer gyerekek () névteret vesz, és előtaggal kezdődő gyermekelemeket ad vissza. Két argumentumra van szükség, az első egy XML-névtér, a második pedig opcionális argumentum, amely alapértelmezés szerint az hamis... Ha a második argumentum IGAZ, a névteret előtagként kezeli a rendszer. Ha FALSE, akkor a névteret 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 elemek névterére való hivatkozáskor használja őket. Valójában ez a legjobb módja az elemek elérésének, mert nem kell keményen kódolnia az URI-t.

$ névterek = $ nyelvek> -> getNamespaces (igaz);
$ dc = $ nyelvek -> lang [1] -> gyermekek ($ névterek ["dc"]);

echo $ dc -> alkotó;

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 alapértelmezés szerint az hamis... Ha úgy állítod be igaz akkor ez a metódus a szülő és gyermek csomópontokban használt neveket adja vissza. Ellenkező esetben olyan névtereket talál, amelyeket csak a szülőcsomópontban használnak.

Most a következőképpen lépkedhet a nyelvek listáján:

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

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

% s % d-ben jelent meg, és % s hozta létre.

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

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

Nézzünk meg egy példát, amely RSS-hírcsatornát kap egy YouTube-csatornától, és megjeleníti az összes videóra mutató hivatkozásokat. Ehhez vegye fel a kapcsolatot a következő 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 megkeresé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 (igaz);

Ha megnézi az XML-hírcsatornát, láthatja, hogy több elem is van benne entitás, amelyek mindegyike üzlet részletes információk a csatorna egy adott videójáról. De csak bélyegképeket, videó URL-t és címet használunk. Ez a három elem az elem leszármazottja csoport ami viszont annak a gyermeke belépés:

>

>



Cím... >

>

>

Csak végigmegyünk az összes elemen. belépés, és mindegyiknél kivonjuk szükséges információ... vegye figyelembe, hogy játékos, miniatűrés cím a média névtérben vannak. Ezért 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 $ bejegyzésként) (
$ csoport = $ bejegyzés -> gyerekek ($ ns ["média"]);
$ csoport = $ csoport -> csoport;
$ thumbnail_attrs = $ csoport -> bélyegkép [1] -> attribútumok ();
$ kép = $ thumbnail_attrs ["url"];
$ játékos = $ csoport -> játékos -> attribútumok ();
$ link = $ player ["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. Olvassa el a dokumentációt, ha többet szeretne megtudni a SimpleXML-ről.


Ha kérdése van, javasoljuk, hogy használja

Most az XML-lel való munkát fogjuk tanulmányozni. Az XML a webhelyek közötti adatcsere formátuma. Nagyon hasonlít a HTML-hez, kivéve, hogy az XML lehetővé teszi a saját címkéit és attribútumait.

Miért van szükség XML-re az elemzés során? Néha megesik, hogy az elemezni kívánt webhely rendelkezik egy API-val, amellyel túl sok megerőltetés nélkül elérheti, amit akar. Ezért csak egy tipp – a webhely elemzése előtt ellenőrizze, hogy van-e API-ja.

Mi az API? Ez egy olyan funkciókészlet, amellyel kérést küldhet erre az oldalra, és megkaphatja a kívánt választ. Ez a válasz leggyakrabban XML formátumban érkezik. Tehát térjünk rá a tanulmányozására.

XML-lel végzett munka PHP-ben

Tegyük fel, hogy van XML-je. Lehet karakterláncban, fájlban tárolva, vagy kérésre visszaküldhető egy adott URL-re.

Legyen az XML egy karakterláncban tárolva. Ebben az esetben ebből a sorból kell létrehoznia egy objektumot a használatával új SimpleXMLElement:

$ str = " Kolya 25 1000 "; $ xml = new SimpleXMLElement ($ str);

Most van egy változónk $ xml elemzett XML-lel rendelkező objektum kerül tárolásra. Az objektum tulajdonságainak elérésével hozzáférhet az XML-címkék tartalmához. Hogyan pontosan - egy kicsit alább elemezzük.

Ha az XML fájlban van tárolva, vagy egy URL elérése révén kerül visszaadásra (ami leggyakrabban így van), akkor a függvényt kell használni simplexml_load_file amely ugyanazt a tárgyat teszi $ xml:

Kolya 25 1000

$ xml = simplexml_load_file (fájl vagy url elérési útja);

Hogyan dolgozz

Az alábbi példákban az XML-t fájlban vagy URL-ben tároljuk.

Legyen megadva a következő XML:

Kolya 25 1000

Nézzük az alkalmazott nevét, életkorát és fizetését:

$ xml = simplexml_load_file (fájl vagy url elérési útja); echo $ xml-> név; // kiírja a "Kolya" echo $ xml-> age; // kiír 25 echo $ xml-> fizetés; // 1000-et nyomtat

Amint látható, a $ xml objektum a címkéknek megfelelő tulajdonságokkal rendelkezik.

Talán észrevetted, hogy a címke sehol nem jelenik meg a címben. Ez azért van, mert ez a gyökércímke. Átnevezheti például a következőre - és semmi sem fog változni:

Kolya 25 1000

$ xml = simplexml_load_file (fájl vagy url elérési útja); echo $ xml-> név; // kiírja a "Kolya" echo $ xml-> age; // kiír 25 echo $ xml-> fizetés; // 1000-et nyomtat

Csak egy gyökércímke lehet az XML-ben, akárcsak egy címkében normál HTML-ben.

Módosítsuk egy kicsit az XML-nket:

Kolya 25 1000

Ebben az esetben egy hívásláncot kapunk:

$ xml = simplexml_load_file (fájl vagy url elérési útja); echo $ xml-> dolgozó-> név; // kiírja "Kolya" echo $ xml-> worker-> age; // kiír 25 echo $ xml-> dolgozó-> fizetés; // 1000-et nyomtat

Munka attribútumokkal

Néhány adatot tároljunk attribútumokban:

1. szám

$ xml = simplexml_load_file (fájl vagy url elérési útja); echo $ xml-> dolgozó ["név"]; // megjeleníti a "Kolya" echo $ xml-> dolgozót ["age"]; // kiír 25 echo $ xml-> dolgozó ["fizetés"]; // kiír 1000 echo $ xml-> worker; // megjeleníti az "1-es számot"

Elválasztó címkék

A kötőjellel ellátott címkék (és attribútumok) megengedettek az XML-ben. Ebben az esetben az ilyen címkék a következőképpen érhetők el:

Kolya Ivanov

$ xml = simplexml_load_file (fájl vagy url elérési útja); echo $ xml-> dolgozó -> (keresztnév); // kiírja a "Kolya" echo $ xml-> worker -> (vezetéknév); // megjeleníti az "Ivanov" kifejezést

Iteráció hurkon keresztül

Most ne egy alkalmazottunk legyen, hanem több. Ebben az esetben egy foreach ciklus segítségével iterálhatjuk az objektumunkat:

Kolya 25 1000 Vasya 26 2000 Péter 27 3000

$ xml = simplexml_load_file (fájl vagy url elérési útja); foreach ($ xml mint $ worker) (echo $ worker-> name; // kiírja: "Kolya", "Vasya", "Petya")

Objektumtól normál tömbig

Ha nem szeret egy objektummal dolgozni, a következő okos trükk segítségével átalakíthatja azt normál PHP tömbbé:

$ xml = simplexml_load_file (fájl vagy url elérési útja); var_dump (json_decode (json_encode ($ xml), igaz));

Több információ

Elemzés a sitemap.xml alapján

A webhely gyakran tartalmaz egy sitemap.xml fájlt. Ez a fájl a webhely összes oldalára mutató hivatkozásokat tárol a keresőmotorok általi indexelés megkönnyítése érdekében (az indexelés valójában a webhely Yandex és Google általi elemzése).

Általában nem kell sokat törődnünk azzal, hogy miért van szükség erre a fájlra, a lényeg az, hogy ha létezik, akkor ne másszon fel az oldal lapjait semmilyen okos módszerrel, hanem egyszerűen használja ezt a fájlt.

A fájl meglétének ellenőrzése: elemezzük a site.ru webhelyet, majd a böngészőben lépjen a site.ru/sitemap.xml oldalra - ha lát valamit, akkor ott van, és ha nem látja , akkor sajnos.

Ha van oldaltérkép, akkor az a webhely összes oldalára mutató hivatkozásokat tartalmaz XML formátumban. Nyugodtan vegye ezt az XML-t, elemezze, különítse el a kívánt oldalakra mutató hivatkozásokat az Ön számára megfelelő módon (például az URL elemzésével, amit a pók módszernél leírtak).

Ennek eredményeként megkapja a linkek listáját az elemzéshez, csak el kell mennie hozzájuk, és elemeznie kell a szükséges tartalmat.

További információ a sitemap.xml eszközről a Wikipédiában.

Mi legyen a következő:

Kezdje el a feladatok megoldását az alábbi linken: feladatok a leckéhez.

Ha mindent eldöntött, folytassa egy új téma tanulmányozását.


a cikk közzététele csak a cikk szerzőjének weboldalára mutató hivatkozással engedélyezett

Ebben a cikkben egy példát mutatok be egy nagy XML-fájl elemzésére. Ha a szervere (hosting) nem tiltja a szkript futási idejének növelését, akkor legalább gigabájt tömegű XML-fájlt is elemezhet, ő személyesen csak 450 megabájt súlyú ózon fájlokat elemzett.

Két probléma adódik a nagy XML-fájlok elemzésekor:
1. Nincs elég memória.
2. Nincs elegendő idő a szkript működéséhez.

A második idővel kapcsolatos probléma megoldható, ha a szerver nem tiltja.
De a memória problémáját nehéz megoldani, még akkor is, ha a saját szerveréről beszélünk, akkor nem túl könnyű 500 megabájtos fájlokat mozgatni, és egyszerűen nem lehet növelni a memóriát a tárhelyen és a VDS-en.

A PHP számos beépített XML-feldolgozási opcióval rendelkezik - SimpleXML, DOM, SAX.
Mindezeket a lehetőségeket számos példacikk részletezi, de minden példa bemutatja a teljes XML-dokumentummal való munkát.

Íme egy példa egy objektum XML-fájlból való lekérésére

Most már feldolgozhatja ezt az objektumot, DE ...
Amint láthatja, a teljes XML-fájlt a rendszer beolvassa a memóriába, majd mindent egy objektummá értelmez.
Vagyis minden adat a memóriába kerül, és ha kicsi a lefoglalt memória, akkor a szkript leáll.

Ez az opció nem alkalmas nagy fájlok feldolgozására, soronként kell olvasni a fájlt, és ezeket az adatokat sorra kell feldolgozni.
Ebben az esetben az érvényesség ellenőrzése az adatok feldolgozásával megegyező módon történik, így képesnek kell lennie a visszagörgetésre, például érvénytelen XML fájl esetén az adatbázisba bevitt összes adat törlésére, ill. menjen át kétszer a fájlon, először olvassa el az érvényességet, majd olvassa el az adatok feldolgozásához.

Itt van egy elméleti példa egy nagy XML-fájl elemzésére.
Ez a szkript egyszerre egy-egy karaktert olvas be a fájlból, ezeket az adatokat blokkokra állítja össze, és elküldi az XML-elemzőnek.
Ez a megközelítés teljesen megoldja a memóriaproblémát, és nem okoz stresszt, de idővel súlyosbítja a problémát. Az alábbiakban olvashat arról, hogyan próbálja meg megoldani a problémát idővel.

Webi_xml függvény ($ fájl)
{

########
### funkció az adatokkal való munkavégzéshez

{
$ adatok nyomtatása;
}
############################################



{
nyomtatás $ név;
print_r ($ attrs);
}


## end tag funkció
függvény endElement ($ elemző, $ név)
{
nyomtatás $ név;
}
############################################

($ xml_parser, "adat");

// nyissa meg a fájlt
$ fp = fopen ($ fájl, "r");

$ perviy_vxod = 1; $ adat = "";



{

$ simvol = fgetc ($ fp); $ adat = $ simvol;


if ($ simvol! = ">") (folytatás;)


visszhang"

szünet;
}

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

Webi_xml ("1.xml");

?>

Ebben a példában mindent egy webi_xml () függvénybe tettem, és a legalul láthatod a hívását.
Maga a szkript három fő funkcióból áll:
1. A függvény, amely elkapja a startElement () címke nyitását
2. Egy függvény, amely elkapja az endElement () címke bezárását
3. És az adatok fogadásának funkciója ().

Tegyük fel, hogy az 1.xml fájl tartalma egy recept



< title >Egyszerű kenyér
< ingredient amount = "3" unit = "стакан" >Liszt
< ingredient amount = "0.25" unit = "грамм" >Élesztő
< ingredient amount = "1.5" unit = "стакан" >Meleg víz
< ingredient amount = "1" unit = "чайная ложка" >Só
< instructions >
< step > Az összes hozzávalót összekeverjük és alaposan összegyúrjuk.
< step > Fedjük le egy ruhával, és hagyjuk egy órán át meleg szobában..
< step > Ismét összegyúrjuk, tepsire tesszük és betesszük a sütőbe.
< step > Látogassa meg a webhely webhelyét


Mindent a webi_xml ("1.xml") általános függvény meghívásával kezdünk;
Ezen túlmenően ebben a funkcióban elindul az elemző, és az összes címkenév nagybetűssé lesz konvertálva, így minden címkének ugyanaz a kis- és nagybetűje lesz.

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

Most jelezzük, hogy mely funkciók működnek a címke nyitásának elfogására, zárásra és az adatok feldolgozására

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

Következik a nyitás a megadott fájlt, ismételje meg a fájlt egy karakterrel, és adja hozzá az egyes karaktereket a karakterlánc változóhoz, amíg meg nem talál egy karaktert > .
Ha ez a legelső hozzáférés a fájlhoz, akkor menet közben minden törlődik, ami a fájl elején felesleges, minden, ami korábban volt. , ezzel a címkével kell kezdődnie az XML-nek.
Először a karakterlánc változó fogja összegyűjteni a karakterláncot

És küldje el az elemzőbe
xml_parse ($ xml_parser, $ adat, feof ($ fp));
Az adatok feldolgozása után a karakterlánc változó eldobásra kerül, és újra kezdődik az adatgyűjtés a karakterláncba, és a karakterlánc másodszor is létrejön

A harmadikban
</b><br>a negyediken <br><b>Egyszerű kenyér

Kérjük, vegye figyelembe, hogy a karakterlánc-változót mindig a kész címke alkotja > és nem szükséges például nyitott és zárt címkét küldeni adatokkal a póknak
Egyszerű kenyér
Ennek a kezelőnek fontos, hogy egy egész, sértetlen címkét kapjon, legalább egy nyitott címkét, de a következő lépésben egy zárt címkét, vagy azonnal kapjon 1000 sort a fájlból, nem számít, a lényeg, hogy a a címke például nem törik el

le> Egyszerű kenyér
Ilyen módon nem küldhet adatot a kezelőnek, mert a címke elromlott.
Ki lehet találni egy saját módszert a kezelőnek való adatküldésre, például 1 megabájt adatot összegyűjtve elküldi a kezelőnek, hogy növelje a sebességet, csak ügyeljen arra, hogy a címkék mindig kitöltve legyenek, és az adatok törhetők legyenek.
Egyszerű</b><br><b>kenyér

Így tetszőleges részekben küldhet egy nagy fájlt a kezelőnek.

Most pedig nézzük meg, hogyan dolgozzák fel ezeket az adatokat, és hogyan szerezhetők be.

Kezdjük a nyitó címkék funkcióval startElement ($ elemző, $ név, $ attrs)
Tegyük fel, hogy a feldolgozás elérte a sort
< ingredient amount = "3" unit = "стакан" >Liszt
Ekkor a függvényen belül a $ name változó egyenlő lesz hozzávaló vagyis a nyitott címke neve (még nem zárta be a címkét).
Ebben az esetben a $ attrs címke attribútumainak tömbje is elérhető lesz, amelyben lesznek adatok mennyiség = "3" és egység = "üveg".

Ezt követően a nyitott címke adatainak feldolgozása a funkcióval adat ($ elemző, $ adat)
A $ adatváltozó mindent tartalmaz a nyitó és záró címke között, esetünkben ez a Liszt szöveg

A karakterláncunk feldolgozását pedig a függvény fejezi be endElement ($ elemző, $ név)
Ez a zárt címke neve, esetünkben a $ név egyenlő lesz hozzávaló

Utána pedig újra körbe ment minden.

A fenti példa csak az XML feldolgozás elvét mutatja be, de a valós használathoz még tovább kell fejleszteni.
Általában nagyméretű XML elemzése szükséges az adatok adatbázisba történő beírásához, és a helyes adatfeldolgozáshoz tudnia kell, hogy az adatok melyik nyitott címkéhez tartoznak, melyik tag-beágyazási szint és mely címkék nyitottak a hierarchiában magasabban. Ezen információk birtokában probléma nélkül tudja megfelelően feldolgozni a fájlt.
Ehhez meg kell adnia több globális változót, amelyek információkat gyűjtenek a nyitott címkékről, a beágyazásról és az adatokról.
Íme egy példa, amelyet használhat

Webi_xml függvény ($ fájl)
{
globális $ webi_depth; // számláló a beágyazási mélység nyomon követéséhez
$ webi_mélység = 0;
globális $ webi_tag_open; // jelenleg megnyitott címkék tömbjét fogja tartalmazni
$ webi_tag_open = tömb ();
globális $ webi_data_temp; // ez a tömb egy címke adatait fogja tartalmazni

####################################################
### funkció az adatokkal való munkavégzéshez
függvényadatok ($ elemző, $ adat)
{
globális $ webi_depth;
globális $ webi_tag_open;
globális $ webi_data_temp;
// adatok hozzáadása a tömbhöz, amely jelzi a beágyazott és jelenleg nyitott címkét
$ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["data"] = $ adat;
}
############################################

####################################################
### nyitó címkék funkció
függvény startElement ($ értelmező, $ név, $ attrs)
{
globális $ webi_depth;
globális $ webi_tag_open;
globális $ webi_data_temp;

// ha a beágyazási szint már nem nulla, akkor egy címke már nyitva van
// és az abból származó adatok már a tömbben vannak, akkor feldolgozhatod
if ($ webi_depth)
{




" ;

nyomtatni"
" ;
print_r ($ webi_tag_open); // nyitott címkék tömbje
nyomtatni"


" ;

// az adatok feldolgozása után töröljük a memória felszabadításához
unset ($ GLOBALS ["webi_data_temp"] [$ webi_depth]);
}

// most elkezdődött a következő címke megnyitása, és a további feldolgozás a következő lépésben történik meg
$ webi_depth ++; // fészekrakás növelése

$ webi_tag_open [$ webi_depth] = $ név; // az open tag hozzáadása az információs tömbhöz
$ webi_data_temp [$ webi_depth] [$ név] ["attrs"] = $ attrs; // most adja hozzá a címke attribútumait

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

#################################################
## end tag funkció
függvény endElement ($ értelmező, $ név) (
globális $ webi_depth;
globális $ webi_tag_open;
globális $ webi_data_temp;

// itt kezdődik az adatfeldolgozás, például az adatbázisba való felvétel, fájlba mentés stb.
// A $ webi_tag_open nyitott címkék láncát tartalmazza beágyazási szint szerint
// például a $ webi_tag_open [$ webi_depth] tartalmazza annak a nyitott címke nevét, amelynek információi jelenleg feldolgozás alatt állnak
// $ webi_depth címke beágyazási szintje
// $ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["attrs"] címkeattribútumok tömbje
// $ webi_data_temp [$ webi_depth] [$ webi_tag_open [$ webi_depth]] ["data"] címkeadatok

Nyomtassa ki az "adatokat". $ 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"]);
nyomtatni"
" ;
print_r ($ webi_tag_open);
nyomtatni"


" ;

Unset ($ GLOBALS ["webi_data_temp"]); // az adatok feldolgozása után töröljük a teljes tömböt adatokkal, mivel a címke zárva volt
unset ($ GLOBALS ["webi_tag_open"] [$ webi_depth]); // információ eltávolítása erről a megnyitott címkéről ... a bezárása óta

$ webi_depth -; // a beágyazás csökkentése
}
############################################

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

// adja meg, hogy mely függvények működjenek a címkék megnyitásakor és bezárásakor
xml_set_element_handler ($ xml_parser, "startElement", "endElement");

// függvény megadása az adatokkal való munkavégzéshez
xml_set_character_data_handler($ xml_parser, "adat");

// nyissa meg a fájlt
$ fp = fopen ($ fájl, "r");

$ perviy_vxod = 1; // jelölje be az első fájlbejegyzés ellenőrzéséhez
$ adat = ""; // itt részletekben gyűjtjük az adatokat a fájlból és elküldjük az xml elemzőnek

// ciklus, amíg meg nem találja a fájl végét
míg (! feof ($ fp) és $ fp)
{
$ simvol = fgetc ($ fp); // beolvas egy karaktert a fájlból
$ adat = $ simvol; // adja hozzá ezt a szimbólumot az elküldendő adatokhoz

// ha a karakter nem zárócímke, akkor visszamegyünk a ciklus elejére, és hozzáadunk egy másik karaktert az adatokhoz, és így tovább, amíg meg nem találjuk a végcímkét
if ($ simvol! = ">") (folytatás;)
// ha záró címkét találtunk, most küldje el ezeket az összegyűjtött adatokat feldolgozásra

// ellenőrizze, hogy ez-e az első bejegyzés a fájlba, majd töröljön mindent, ami a címke előtt van// mivel néha az XML kezdete előtt szemetet lehet találni (ügyetlen szerkesztők, vagy a fájlt egy script fogadja egy másik szerverről)
if ($ perviy_vxod) ($ data = strstr ($ adat, "

// most bedobjuk az adatokat az xml elemzőbe
if (! xml_parse ($ xml_parser, $ data, feof ($ fp))) (

// itt lehet feldolgozni és érvényességi hibákat kérni...
// amint hiba történik, az elemzés leáll
visszhang"
XML-hiba: ". Xml_error_string (xml_get_error_code ($ xml_parser));
visszhang "vonalnál". xml_get_current_line_number ($ xml_parser);
szünet;
}

// az elemzés után dobja el az összegyűjtött adatokat a ciklus következő lépéséhez.
$ adat = "";
}
fclose ($ fp);
xml_parser_free ($ xml_parser);
// globális változók eltávolítása
unset ($ GLOBALS ["webi_depth"]);
unset ($ GLOBALS ["webi_tag_open"]);
unset ($ GLOBALS ["webi_data_temp"]);

Webi_xml ("1.xml");

?>

Az egész példát megjegyzések kísérték, most teszteljetek és kísérletezzetek.
Kérjük, vegye figyelembe, hogy az adatokkal való munkavégzés funkciójában az adatok nem egyszerűen egy tömbbe kerülnek, hanem a " .=" mivel előfordulhat, hogy az adatok nem érkeznek teljes egészében, és ha egyszerű feladatot adsz meg, akkor időről időre darabokban kapod meg az adatokat.

Nos, ennyi, most már tetszőleges méretű fájl feldolgozásakor van elég memória, de a szkript futási ideje többféleképpen növelhető.
A szkript elejére illessze be a függvényt
set_time_limit (6000);
vagy
ini_set ("max. végrehajtási_idő", "6000");

Vagy adja hozzá a szöveget a .htaccess fájlhoz
php_value max_execution_time 6000

Ezek a példák a szkript futási idejét 6000 másodpercre növelik.
Az időt így csak letiltott módban növelheti.

Ha van hozzáférése a php.ini szerkesztéséhez, növelheti az időt a következővel
maximális_végrehajtási_idő = 6000

Például a hosting masterhost-on az írás idején a szkriptidő növelése tilos, a letiltott csökkentett mód ellenére, de ha profi vagy, készíthetsz saját php-összeállítást a masterhost-on, de ez nem erről ebben a cikkben.

Az oktatóanyag néhány példája XML-karakterláncot tartalmaz. Ahelyett, hogy minden példában megismételné, helyezze el azt a sort egy fájlba, amelyet minden példában felvesz. Ez a vonal látható a következő példában. Ezenkívül XML-dokumentumot is készíthet, és a funkcióval elolvashatja simplexml_load_file ().

1. példa Példa.php fájl XML karakterlánccal

$ xmlstr =<<


PHP: Az elemző bemutatása


Kisasszony. Kódoló
Onlivia Actora


Úr. Kódoló
El ActÓr


Tehát ez egy nyelv. Ez még mindig egy programozási nyelv. Vagy
ez egy script nyelv? Ebben a dokumentumfilmben minden kiderül
mint egy horrorfilmben.




7
5


XML;
?>

A SimpleXML használata egyszerű! Próbáljon ki egy karakterláncot vagy számot az alapul szolgáló XML-dokumentumból.

2. példa Dokumentum egy részének lekérése

tartalmazza az "example.php" kifejezést;

echo $ filmek -> film [0] -> cselekmény;
?>

Tehát ez egy nyelv. Ez még mindig egy programozási nyelv. Vagy ez egy script nyelv? Ebben a horrorszerű dokumentumfilmben minden kiderül.

PHP-ben egy XML-dokumentum olyan eleméhez férhet hozzá, amely érvénytelen karaktereket (például kötőjelet) tartalmaz a nevében, ha az adott elem nevét kapcsos zárójelek és aposztrófok közé helyezi.

3. példa Egy karakterlánc lekérése

tartalmazza az "example.php" kifejezést;

echo $ filmek -> film -> ("nagyvonalak") -> sor;
?>

Ennek a példának az eredménye:

A PHP minden webproblémát megold

4. példa Nem egyedi elemek elérése a SimpleXML-ben

Abban az esetben, ha egy szülőelemben több gyermekelem is található, akkor a szabványos iterációs módszereket kell használnia.

tartalmazza az "example.php" kifejezést;

$ filmek = új SimpleXMLElement ($ xmlstr);

/ * Minden csomóponthoz , a nevet külön jelenítjük meg . */
foreach ($ filmek -> film -> karakterek -> karakter mint $ karakter) (
echo $ karakter -> név, "játszó", $ karakter -> színész, PHP_EOL;
}

?>

Ennek a példának az eredménye:

Kisasszony. A kódolót Onlivia Actora Mr. A kódolót El ActÓr alakítja

Megjegyzés:

Tulajdonságok ( $ filmek-> film az előző példában) nem tömbök. Tömbként iterálható.

5. példa Attribútumok használata

Eddig csak az elemek nevét és értékét kaptuk meg. A SimpleXML hozzáférhet egy elem attribútumaihoz is. Egy elemattribútum ugyanúgy elérhető, mint a tömbelemek ( sor).

tartalmazza az "example.php" kifejezést;

$ filmek = új SimpleXMLElement ($ xmlstr);

/ * Hozzáférés a csomóponthoz az első film.
* Az értékelési skálát is megjelenítjük. * /
foreach ($ filmek -> film [0] -> értékelés $ értékelésként) (
kapcsoló ((karakterlánc) $ értékelés ["típus"]) ( // Az elem attribútumainak lekérése index szerint
"hüvelykujj" eset:
echo $ értékelés, "tetszik";
szünet;
"csillagok" eset:
echo $ értékelés, "csillagok";
szünet;
}
}
?>

Ennek a példának az eredménye:

7 remek 5 csillag

6. példa Elemek és attribútumok összehasonlítása szöveggel

Ha egy elemet vagy attribútumot szeretne összehasonlítani egy karakterlánccal, vagy szövegként szeretné átadni egy függvénynek, át kell adnia egy karakterláncba a (húr)... Ellenkező esetben a PHP objektumként kezeli az elemet.

tartalmazza az "example.php" kifejezést;

$ filmek = új SimpleXMLElement ($ xmlstr);

if ((karakterlánc) $ filmek -> film -> cím == "PHP: The Rise of the Parser") {
nyomtatás – A kedvenc filmem.;
}

echo htmlentities ((karakterlánc) $ filmek -> film -> cím);
?>

Ennek a példának az eredménye:

Kedvenc filmem Php: The Emergence of the Parser

7. példa Két elem összehasonlítása

Két SimpleXMLElement akkor is eltérőnek számít, ha ugyanarra az objektumra mutat a PHP 5.2.0 óta.

tartalmazza az "example.php" kifejezést;

$ filmek1 = új SimpleXMLElement ($ xmlstr);
$ filmek2 = új SimpleXMLElement ($ xmlstr);
var_dump ($ filmek1 == $ filmek2); // hamis a PHP 5.2.0 óta
?>

Ennek a példának az eredménye:

8. példa XPath használata

A SimpleXML beépített XPath támogatást tartalmaz. Találja meg az összes elemet :

tartalmazza az "example.php" kifejezést;

$ filmek = új SimpleXMLElement ($ xmlstr);

foreach ($ filmek -> xpath ("// karakter") $ karakterként) (
echo $ karakter -> név, "játszó", $ karakter -> színész, PHP_EOL;
}
?>

"// "sablonként szolgál. Abszolút elérési út megadásához hagyja ki az egyik perjelet.

Ennek a példának az eredménye:

Kisasszony. A kódolót Onlivia Actora Mr. A kódolót El ActÓr alakítja

9. példa Értékek beállítása

A SimpleXML-ben lévő adatoknak nem kell megváltoztathatatlannak lenniük. Az objektum lehetővé teszi az összes elem kezelését.

tartalmazza az "example.php" kifejezést;
$ filmek = új SimpleXMLElement ($ xmlstr);

$ filmek -> film [0] -> karakterek -> karakter [0] -> név = "Kódoló kisasszony";

echo $ filmek -> asXML ();
?>

Ennek a példának az eredménye:

PHP: Az elemző bemutatása Kódoló kisasszony Onlivia Actora Úr. Kódoló El ActÓr 7 5

10. példa Elemek és attribútumok hozzáadása

A PHP 5.1.3 óta a SimpleXML képes könnyen hozzáadni gyermekelemeket és attribútumokat.

tartalmazza az "example.php" kifejezést;
$ filmek = új SimpleXMLElement ($ xmlstr);

$ karakter = $ filmek -> film [0] -> karakterek -> addChild ("karakter");
$ karakter -> addChild ("név", "Mr. Elemző");
$ karakter -> addChild ("színész", "John Doe");

$ értékelés = $ filmek -> film [0] -> addChild ("értékelés", "PG");
$ értékelés -> addAttribute ("type", "mpaa");

echo $ filmek -> asXML ();
?>

Ennek a példának az eredménye:

PHP: Az elemző bemutatása Kisasszony. Kódoló Onlivia Actora Úr. Kódoló El ActÓr Úr. ElemzőGipsz Jakab Tehát ez egy nyelv. Ez még mindig egy programozási nyelv. Vagy ez egy script nyelv? Ebben a horrorszerű dokumentumfilmben minden kiderül. A PHP minden webes feladatomat megoldja 7 5 PG

11. példa Interakció a DOM-mal

A PHP képes az XML csomópontokat SimpleXML-ből DOM formátumba konvertálni és fordítva. Ez a példa bemutatja, hogyan módosíthat egy DOM-elemet a SimpleXML-ben.

$ dom = új DOMDocument;
$ dom -> loadXML ( "ostobaság" );
if (! $ dom) (
visszhang "Hiba történt a dokumentum elemzése közben";
kijárat;
}

$ könyvek = simplexml_import_dom ($ dom);

echo $ könyvek -> könyv [0] -> cím;
?>

Ennek a példának az eredménye:

4 évvel ezelőtt

Van egy gyakori „trükk”, amelyet gyakran javasolnak a SimpleXML-objektumok tömbbé alakítására, a json_encode (), majd a json_decode () függvényen keresztül futtatva. Szeretném elmagyarázni, hogy ez miért rossz ötlet.

A legegyszerűbben azért, mert a SimpleXML lényege, hogy könnyebben használható és erősebb, mint egy sima tömb. Például írhatszbar -> baz ["bing"]?> és ugyanazt jelenti, mintbar [0] -> baz [0] ["bing"]?>, függetlenül attól, hogy hány bar vagy baz elem van az XML-ben; és ha írszbar [0] -> baz [0]?> megkapja az adott csomópont összes karakterlánc-tartalmát - beleértve a CDATA szakaszokat is -, függetlenül attól, hogy vannak-e gyermekelemei vagy attribútumai is. Hozzáférhet a névtér-információkhoz, egyszerű szerkesztések végrehajtására az XML-ben, és még DOM-objektumba is "importálhat" a sokkal hatékonyabb manipuláció érdekében. Mindez elveszik, ha az objektumot tömbbé alakítjuk, ahelyett, hogy elolvasnánk az ezen az oldalon található példákat.

Ezen túlmenően, mivel nem erre a célra készült, a JSON-ra és vissza történő átalakítás bizonyos helyzetekben ténylegesen elveszíti az adatokat. Például a névtérben lévő elemek vagy attribútumok egyszerűen el lesznek vetve, és minden szöveges tartalom el lesz vetve, ha egy elemnek gyermekei vagy attribútumai is vannak. Néha ez "nem számít, de ha megszokja, hogy mindent tömbökké alakítson át", az előbb-utóbb csípni fog.

Természetesen írhatna egy intelligensebb konverziót, amely nem rendelkezik ilyen korlátokkal, de ezen a ponton a SimpleXML-ből egyáltalán nem kap értéket, és csak az alacsonyabb szintű XML-elemző függvényeket vagy az XMLReader osztályt kell használnia, Még mindig "nem fogja megkapni a SimpleXML extra kényelmi funkcióit, de ez" az Ön vesztesége.

2 évvel ezelőtt

Ha az xml-karakterlánc "0"-val és "1-gyel" kódolt logikai értékeket tartalmaz, akkor problémákba ütközik, amikor az elemet közvetlenül a bool-ba önti:

$ xmlstr =<<

1
0

XML;
$ értékek = új SimpleXMLElement ($ xmlstr);
$ truevalue = (bool) $ értékek-> truevalue; // igaz
$ falsevalue = (bool) $ értékek-> falsevalue; // is igaz!!!

Ehelyett először karakterláncra vagy intre kell átküldenie:

$ truevalue = (bool) (int) $ értékek-> truevalue; // igaz
$ falsevalue = (bool) (int) $ értékek-> falsevalue; // hamis

9 évvel ezelőtt

Ha válaszában érvényes xml-t kell megadnia, ne felejtse el beállítani a fejléctartalom típusát xml-re az asXML eredményének visszajelzése mellett ():

$ xml = simplexml_load_file ("...");
...
... xml cucc
...

// xml-t ír ki a válaszában:
fejléc ("Content-Type: text / xml");
echo $ xml -> asXML ();
?>

9 évvel ezelőtt

A README fájlból:

A SimpleXML célja az XML adatok egyszerű elérésének módja.

A SimpleXML objektumok négy alapvető szabályt követnek:

1) a tulajdonságok elemiterátorokat jelölnek
2) a numerikus indexek elemeket jelölnek
3) a nem numerikus indexek attribútumokat jelölnek
4) A karakterlánc-konverzió lehetővé teszi a SZÖVEG adatok elérését

A tulajdonságok iterálásakor a kiterjesztés mindig ismétlődik
minden ilyen elemnévvel rendelkező csomópont. Így a módszergyerekeknek ()-nek kell lenniük
alcsomópontok feletti iterációra hívják. De a következőket is megteszi:
foreach ($ obj-> node_name mint $ elem) (
// csinálj valamit a $ elemmel
}
mindig a "node_name" elemek iterációját eredményezi. Szóval ne tovább
ellenőrzés szükséges az adott típusú csomópontok számának megkülönböztetéséhez.

Amikor egy elemhez egy tulajdonságon keresztül SZÖVEG adatok érhetők el
akkor az eredmény nem tartalmazza a részelemek SZÖVEG adatait.

Ismert problémák
============

Motorproblémák miatt jelenleg nem lehet hozzáférni
egy részelem 0 index szerint: $ objektum-> tulajdonság.

8 évvel ezelőtt

Az olyan dolgok használata, mint például: is_object ($ xml-> modul-> admin) annak ellenőrzésére, hogy valóban létezik-e "admin" nevű csomópont, nem úgy tűnik, hogy a várt módon működik, mivel a simplexml mindig egy objektumot ad vissza - ebben az esetben egy üres - még akkor is, ha egy adott csomópont nem létezik.
Számomra a jó öreg üres () funkció jól működik ilyen esetekben.

8 évvel ezelőtt

Egy gyors tipp az xpath lekérdezésekhez és az alapértelmezett névterekhez. Úgy tűnik, hogy a SimpleXML mögött meghúzódó XML-rendszer ugyanúgy működik, mint szerintem a .NET XML-rendszere: ha valamit meg kell címezni az alapértelmezett névtérben, akkor deklarálnia kell a névteret a registerXPathNamespace használatával, majd az előtagot kell használnia címezze meg az egyébként az alapértelmezett névtér élő elemét.

$ karakterlánc =<<

Negyven Mi?
Joe
Jane

Tudom, hogy ez a válasz – de mi a kérdés?


XML;

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

$ csomópontok = $ xml -> xpath ("// def: document / def: title");

?>

9 évvel ezelőtt

Noha a SimpleXMLElement azt állítja, hogy iterálható, úgy tűnik, hogy nem valósítja meg a szabványos Iterator interfész funkcióit, mint például a :: next és :: reset megfelelően. Ezért míg a foreach () működik, az olyan funkciók, mint a next (), az aktuális () vagy az egyes () nem úgy tűnik, hogy úgy működnek, ahogyan azt elvárná – a mutató soha nem mozdul, vagy folyamatosan visszaáll.

6 évvel ezelőtt

Ha az XML-dokumentum kódolása eltér az UTF-8-tól, a kódolási deklarációnak közvetlenül a version = "..." után és a standalone = "..." előtt kell következnie. Ez az XML szabvány követelménye.

Ha az XML-dokumentum kódolása eltér az UTF-8-tól. A kódolási deklarációt közvetlenül a version = "..." és a standalone = "..." előtt kell követnie. Ez a követelmény szabványos XML.


Rendben

Orosz nyelv. orosz nyelv
Végzetes hiba: „Kivétel” el nem fogott kivétel „A karakterlánc nem értelmezhető XML-ként” üzenettel itt...


Minden a legérdekesebb az IT világból

© Copyright 2022, zachetpizza.ru

  • Kategóriák
  • Programok, segédprogramok
  • Online szolgáltatások
  • Internet
  • Okostelefonok
  • sejtes
  •  
  • Programok, segédprogramok
  • Online szolgáltatások
  • Internet
  • Okostelefonok
  • sejtes