XML

Az oldal jelenlegi verzióját még nem ellenőrizték tapasztalt közreműködők, és jelentősen eltérhet a 2022. június 3-án felülvizsgált verziótól ; az ellenőrzések 3 szerkesztést igényelnek .
XML ( angol  eXtensible Markup Language ) bővíthető jelölőnyelv
Kiterjesztés .xml
MIME típusú application/xml [1] , text/xml [2] (elavult egy lejárt piszkozatban) [3]
Fejlesztő World Wide Web Consortium
közzétett 1998
Formátum típusa jelölőnyelv
Kibontva innen SGML
ben fejlődött XHTML , RSS , Atom , KML , SVG és sok más formátum
Szabvány(ok) 1.0 (ötödik kiadás), 2008. november 26. [4] 1.1 (második kiadás), 2006. augusztus 16. [5]
nyílt formátum ? Igen
Weboldal w3.org/XML
 Médiafájlok a Wikimedia Commons oldalon

XML ( MFA : [ ˌ e k s . e m ˈ e l ], rövidítés az angolból. e X tensible Markup L Anguage ) - "extensible markup language ". A World Wide Web Consortium (W3C) ajánlása . Az XML specifikáció leírja az XML dokumentumokat, és részben leírja az XML processzorok (az XML dokumentumokat beolvasó és azok tartalmához hozzáférést biztosító programok) viselkedését. Az XML-t úgy tervezték, hogy egyszerű formális szintaxisú nyelv legyen , könnyen létrehozható és feldolgozható dokumentumok mind a programok , mind az emberek számára, különös tekintettel az internetes használatra. A nyelvet bővíthetőnek nevezzük, mert nem rögzíti a dokumentumokban használt jelöléseket: a fejlesztő szabadon készíthet jelölést egy adott terület igényei szerint, csak a nyelv szintaktikai szabályai korlátozzák. Az XML-kiterjesztés  egy XML-alapú konkrét nyelvtan , amelyet a címkék és attribútumaik szótára, valamint egy olyan szabálykészlet képvisel, amely meghatározza, hogy mely attribútumok és elemek lehetnek más elemekben. Az egyszerű formális szintaxis, az emberbarát jelleg, a bővíthetőség és a dokumentumok tartalmának Unicode kódolásaira való támaszkodás kombinációja mind magának az XML-nek, mind az XML-eredetű speciális nyelveknek a széles körben való elterjedéséhez vezetett. szoftver eszközök.  

Az XML az SGML egy részhalmaza .

XML nyelv

Az XML specifikáció leírja a nyelvet és a dokumentumok kódolásával és feldolgozásával kapcsolatos számos kérdést. Az ebben a részben található anyag az XML-specifikáció nyelvi leírásának összefoglalása, ehhez a cikkhez igazítva.

A dokumentum angol nyelvű változata normatívnak minősül, ezért a főbb kifejezéseket az angol eredetivel együtt adjuk meg.

A főbb kifejezések fordítása alapvetően a specifikáció interneten elérhető orosz nyelvű fordítását követi, a tag és a deklaráció kifejezések kivételével . A tag kifejezéshez itt a fordítási címkét használjuk . A nyilatkozat kifejezésnél előnyben részesítjük a közös fordítási nyilatkozatot (a szintén általános pauszpapír nyilatkozattal szemben ).

A főbb kifejezések egyéb fordításai megtalálhatók a szakirodalomban és az interneten.

Egy dokumentum fizikai és logikai szerkezete

Fizikai szempontból egy dokumentum entitásokból áll , amelyek mindegyike  hivatkozhat egy másik entitásra. Az egyetlen gyökérelem  a dokumentumentitás . Az entitások tartalma szimbólumok.

Logikai szempontból a dokumentum megjegyzésekből ( English  comments ), deklarációkból ( angol  nyilatkozatok ), elemekből ( English  elements ), entitáshivatkozásokból ( English character references ) és feldolgozási utasításokból ( angol feldolgozási utasítások ) áll. A dokumentumban mindezt jelölések strukturálják .   

Fizikai szerkezet

Az entitás  a dokumentum legkisebb része. Minden entitás tartalmaz valamit, és mindegyiknek van neve (vannak kivételek, pl . dokumentum entitás ). Egyszerűen fogalmazva, az "esszencia" kifejezés a "létező dolgot", " valamit " írja le [6] .

A dokumentum olyan entitásokból áll, amelyek tartalma szimbólumokból áll. Minden karakter két típusra osztható: adatkarakterekre ( angol  karakteradatok ) és jelölőkarakterekre. A jelölés a következőket tartalmazza:

  1. tags ( eng.  tags ) <- jelöli az elemek határait
  2. nyilatkozatok és feldolgozási utasítások, beleértve azok attribútumait ( angol  attribútumok )
  3. entitás hivatkozások
  4. Hozzászólások
  5. valamint a „ CDATA ” szakaszokat keretező karaktersorozatok

A bizonylat nem jelölő része a bizonylat karakteradatai.

Logikai szerkezet

A dokumentum összes alkotórészét a prológus és a gyökérelem foglalja össze . A gyökérelem  a dokumentum kötelező része, ami a teljes lényegét alkotja (a prológus általában hiányozhat). A gyökérelem tartalmazhatja beágyazott elemeit, karakteradatait és megjegyzéseit, de nem. A gyökérelembe beágyazott elemek tartalmazhatnak beágyazott elemeket, karakteradatokat és megjegyzéseket stb. A Prolog tartalmazhat deklarációkat , feldolgozási utasításokat , megjegyzéseket . Egy XML-deklarációval kell kezdődnie , bár ez a deklaráció bizonyos helyzetekben elhagyható.

A dokumentumelemeket megfelelően be kell ágyazni : minden olyan elemnek, amely egy másik elemen belül kezdődik (vagyis a gyökérelemtől eltérő dokumentumelemeknél), abban az elemben kell végződnie, amelyen elindult. A karakteradatok az elemeken belül közvetlenül vagy speciális "CDATA" szakaszokban fordulhatnak elő . A nyilatkozatokhoz, feldolgozási utasításokhoz és elemekhez attribútumok rendelhetők. Az attribútumok a név-érték párok logikai szövegegységhez való társítására szolgálnak.

Jelölő szimbólumok

A jelölés mindig egy karakterrel kezdődik, és egy karakterrel <végződik >.

A és szimbólumok <mellett >a szimbólum is különleges szerepet játszik a jelölésben &. A szögzárójelek jelölik az elemek határait, a feldolgozási utasításokat és néhány más sorozatot. Az "és" jel lehetővé teszi a szöveg cseréjét entitásokkal ( angol  entities ) [6] .

A jelölési kétértelműség kezelése

A jelölőkarakterek használata a karakteradatokban megnehezíti a jelölőkonstrukciók felismerését, és szerkezeti kétértelműségi problémát okozhat. Az XML-ben ezt a problémát a következőképpen oldják meg: a <, > és & nem jelenhetnek meg a karakteradatokban és az attribútumértékekben közvetlen formában, ezekben az esetekben speciális entitások vannak fenntartva az ábrázolásukra :

Szimbólum Csere
< <
> >
& &

Ezenkívül a következő entitások használatosak aposztrófok és idézőjelek használatára az attribútumértékeken belül :

' '
" "

A jelölőkarakterek jelölő entitásukra való cseréjének szabálya nem vonatkozik a „CDATA” szakaszok karakteradataira, de a dokumentum minden más helyén végrehajtódik.

Numerikus karakterhivatkozások

A numerikus karakterhivatkozások a karakter kódpozícióját jelzik a dokumentum karakterkészletében. A numerikus karakterhivatkozások kétféle formában lehetnek [7] :

  1. szintaxis " &#D; ”, ahol D egy decimális szám;
  2. szintaxis " &#xH; " vagy " &#XH; ”, ahol H egy hexadecimális szám (a numerikus szimbolikus hivatkozásokban szereplő hexadecimális számok nem különböztetik meg a kis- és nagybetűket).

Példák numerikus karakterhivatkozásokra:

  • å  - (tizedes formában) az "a" betűt jelenti, felette egy kis körrel (például norvég nyelven);
  • å  - (hexadecimálisan) ugyanazt a karaktert jelöli;
  • å  - (hexadecimálisan) is ugyanazt a karaktert jelöli;
  • И  — (tizedes formában) a cirill nagy „I” betűt jelenti;
  • 水  - (hexadecimálisan) a „víz” kínai karakterét jelenti;

Nevek

XML-ben minden névnek betűvel kell kezdődnie, az aláhúzás karakterrel (_) és csak olyan karakterekkel kell folytatódnia, amelyek a nevek számára megengedettek, nevezetesen: csak olyan betűket tartalmazhatnak, amelyek a Unicode betűszakasz részét képezik, arab számokat, kötőjeleket, aláhúzásjeleket. , pontok. Mivel a betűk nem korlátozódnak csak ASCII-karakterekre, a nevekben bármely nyelv betűi használhatók.

Prológus

XML deklaráció

Az XML-deklaráció határozza meg, hogy a dokumentum milyen nyelven íródott. Mivel a dokumentum tartalmának értelmezése a nyelv verziójától függ, a Specifikáció előírja, hogy a dokumentumot XML deklarációval kell indítani. A nyelv első (1.0) változatában a deklaráció használata nem kötelező volt, a későbbiekben kötelező. Így a nyelvi változatot a deklaráció határozza meg, ha pedig nincs deklaráció, akkor az 1.0-s verziót feltételezzük.

Az XML-verzión kívül a deklaráció tartalmazhat információkat a dokumentum kódolásával kapcsolatban és arról is, hogy „a dokumentumnak saját DTD -vel kell-e maradnia , vagy egy benne lévővel”.

Példa:

<?xml version="1.1" encoding="UTF-8" ?>

vagy:

<?xml version="1.0" encoding="windows-1251"?>

Mindezekben a példákban hiányzott az „önálló” attribútum, amely csak azt határozza meg, hogy a jelölések leírását kívülről kell-e szerepeltetni a dokumentumban. Alapértelmezés szerint "nem":

<?xml version="1.0" encoding="windows-1251" standalone="no"?>

Ha az XML dokumentum más DTD-kre hivatkozik, amelyek leírják, hogy a dokumentum mit tartalmazhat, meg kell adniastandalone="no"

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

Ha az XML-dokumentum nem hivatkozik más fájlokra, és a saját DTD-jét használja, meg kell adniastandalone="yes"

Dokumentumtípus nyilatkozat

A bizonylattípus deklarálására külön utasítás vonatkozik !DOCTYPE. Lehetővé teszi, hogy a DTD nyelv használatával meghatározzuk, hogy mely elemek szerepeljenek a dokumentumban, milyen attribútumaik vannak, mely entitások használhatók, és még valami.

Például itt van a megfelelő dokumentum:

<?xml version="1.0"?> <köszöntés> Helló világ! </reeting>

Van egy gyökéreleme <greeting>Hello, world!</greeting>, és logikailag a dokumentum létezik. Ez azonban nem érvényes ( eng.  not valid ) [8] .

A Dokumentumtípus-nyilatkozat (DTD) segítségével lehetőség nyílik annak tartalmának és logikai felépítésének leírására, valamint egy név-érték pár társítására egy adott elemhez. Így néz ki a prológus a Backus-Naur bejegyzésben [9] :

prolog ::= XMLDecl? Egyéb* (doctypedecl Misc*)? XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') Eq ::= S? '='S? VersionNum ::= '1.' [0-9]+ Egyéb ::= Hozzászólás | PI | S doctypedecl ::= '<!DOCTYPE' S név (S külső azonosító)? S? ('[' intSubset ']' S?)? '>' DeclSep ::= PEReference | S intSubset ::= (markupdecl | DeclSep)* markupdecl ::= elementdecl | AttlistDecl | EntityDecl | Jelölés Decl | PI | Megjegyzés extSubset ::= TextDecl? extSubsetDecl extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)*

Az XML-deklarációt megjegyzések, feldolgozási utasítások vagy üres szóközök követhetik [10] , de ezután jön a Document Type Declarations, ahol a "Name" a gyökércímke neve, az " ExternalID" a külső azonosító és az "intSubset" a jelölés deklarációja, vagy az entitás hivatkozása. Ahogy a specifikáció mondja, ha egy külső azonosítót egy belső deklarációval együtt deklarálunk, akkor az utóbbi az előbbi elé kerül [11] .

Például:

<?xml version="1.0"?> <!DOCTYPE üdvözlés SYSTEM "hello.dtd"> <köszöntés> Helló világ! </reeting>

Itt a " SYSTEM "hello.dtd"" egy külső azonosító: a "hello.dtd" cím lehetővé teszi, hogy a "hello.dtd" dokumentumban lévő adatokat jelölődeklarációként használja.

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE üdvözlés [ <!ELEMENT üdvözlés (#PCDATA)> ]> <üdv> Helló világ! </reeting>

Itt a jelölést helyileg deklarálták a !DOCTYPE.

Feldolgozási utasítás

A feldolgozási utasítások ( eng.  processing instruction, PI ), lehetővé teszik, hogy az alkalmazásokhoz tartozó utasításokat helyezze el a dokumentumban. A következő példa egy xml-stylesheet feldolgozási utasítást mutat be, amely a my-style.css fájlban lévő utasításokat a href attribútumon keresztül egy xml-stylesheet alkalmazásnak (például böngészőnek) adja át:

<?xml-stylesheet type="text/css" href="my-style.css"?> Kommentár

A megjegyzések ( eng.  comment ) nem vonatkoznak a dokumentum karakteradataira. A megjegyzés "<!--" sorozattal kezdődik és "-->" sorozattal végződik, a "--" karakterek kombinációja nem fordulhat elő benne. A & karakter nem használható jelölésként a megjegyzésekben.

Példa:

<!-- ez egy megjegyzés -->

Gyökérelem

Az elem és jelölése

Az elem egy  dokumentum logikai szerkezetének fogalma. Minden dokumentum egy vagy több elemet tartalmaz. Az elemek határait kezdő és záró címkék jelzik . Az elem kezdő és záró címkéjében szereplő elem nevének egyeznie kell. Egy elem ábrázolható üres elemcímkével is, azaz nem tartalmaz más elemeket és karakteradatokat.

A címke ( angolul  tag ) egy jelölőkonstrukció, amely egy elem nevét tartalmazza.

Kezdőcímke: <element1>

Végcímke: </element1>

Üres elemcímke: <empty_element1 />

Egy elemben az attribútumok csak a kezdő címkében és az üres elemcímkében használhatók.

Példa egy XML-lel megjelölt receptre:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE recept> <recept neve= "kenyér" preptime= "5 perc" cooktime= "180 perc" > <title> egyszerű kenyér </title> <összetétel> <összetevők mennyisége= "3" egység= "pohár" > Liszt </ingredient> <összetevők mennyisége= "0,25" egység= "gramm" > Élesztő </összetevő> <összetevő mennyisége= "1,5" unit= "glass" > Meleg víz </ingredient> </composition> <instructions> <step> Az összes hozzávalót összekeverjük és alaposan összegyúrjuk. </step> <step> Zárja le egy ruhával, és hagyja egy órán át meleg szobában. </step> <!-- <step> Olvassa el a tegnapi újságot. </step> egy kétes lépés... --> <step> Újra összegyúrjuk, tepsire tesszük és a sütőbe tesszük. </step> </instructions> </recipe> CDATA szekció

A CDATA szakasz nem a szöveg logikai egysége. Egy szakasz a dokumentumban bárhol előfordulhat, ahol a szintaxis lehetővé teszi karakteradatok elhelyezését. A szakasz kezdődik <![CDATA[és véget ér ]]>. E jelölés között karakteradatok találhatók; A karakteradat tehát < > &közvetlen formájukban tartalmazza a karaktereket.

Helyes dokumentum

A jól formázott dokumentum megfelel minden XML-dokumentumra vonatkozó általános XML szintaktikai szabálynak :  helyes dokumentumstruktúra, egyező nevek a kezdő és záró elemcímkében stb. A nem megfelelően formázott dokumentum nem tekinthető dokumentum xml-nek.

Névterek

Dokumentum példa:

<?xml version="1.0" encoding="UTF-8"?> <!-- bejelentkezési képernyő --> <edsscript> <sequence name= "start" > <action cmd= "triggeron" > bt* </action> <action cmd= "triggeron" > msg_generic </action> <action cmd= "disablenbb" > összes </action> <action cmd= "setscrtext" > @@System Giris@@ </action> <action cmd= "enablenbb" > előre, főmenü </action> <action cmd= "switchmsgtarget" > LOGIN_DLG </action> <action cmd= "sendmsg" > Rajt </action> <action cmd= "ugrás" > 2. lépés </action> </sequence> <sequence name= "step2" > <action cmd= "waittrigger" > btnforward </action> <action cmd= "triggeron" > Belépés* </action> <action cmd= "disablenbb" > összes </action> <action cmd= "sendmsg" > jelölje be </action> </sequence> <trigger name= "login_succeded" > <condition type= "appmsg" > login_succeeded </condition> <sequence> <action cmd= "endscript" /> </sequence> </trigger> <trigger name= "login_unknownuser" > <condition type= "appmsg" > login_unknownuser </condition> <sequence name= "login_unknownuser" > <action cmd= "disablenbb" > összes </action> <action cmd= "setscrtext" > @@hata@@ </action> <action cmd= "showhtml" > generic_neg.htm,@@Yanlış kullanıcı ismi@@,@@Lütfen kullanıcı ismini doğru giriniz.@@ </action> <action cmd= "enablenbb" > vissza </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "ugrás" > Rajt </action> </sequence> </trigger> <trigger name= "login_incorrectpwd" > <condition type= "appmsg" > login_incorrectpwd </condition> <sequence name= "login_incorrectpwd" > <action cmd= "disablenbb" > összes </action> <action cmd= "setscrtext" > @@hata@@ </action> <action cmd= "showhtml" > generic_neg.htm,@@Hatalı parola@@,@@Lütfen parolanızı doğru giriniz.@@ </action> <action cmd= "enablenbb" > vissza </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "ugrás" > Rajt </action> </sequence> </trigger> <!-- általános triggerek --> <trigger name= "btnback" > <condition type= "buttonclick" > vissza </condition> <sequence name= "btnback" > <action cmd= "triggeron" > btnback </action> </sequence> </trigger> <trigger name= "btnforward" > <condition type= "buttonclick" > előre </condition> <sequence name= "btnforward" > <action cmd= "triggeron" > btnforward </action> </sequence> </trigger> <trigger name= "btnmainmenu" > <condition type= "buttonclick" > főmenü </condition> <sequence> <action cmd= "jumpscript" > <value label= "mainmenuscript" range = "local" /> </action> </sequence> </trigger> <trigger name= "btnquitapp" > < condition type= "buttonclick" > kilép az alkalmazásból </condition> <sequence name= "btnquitapp" > <action cmd= "callscript" > quitapp.xml </action> <action cmd= "ugrás" > Rajt </action> </sequence> </trigger> <trigger name= "error_generic" > <condition type= "appmsg" > hiba* </condition> <sequence> <action cmd= "showhtml" > errdsc_null.htm,@@Hata@@ </action> <action cmd= "disablenbb" > összes </action> <action cmd= "enablenbb" > előre </action> <action cmd= "waittrigger" > btnforward </action> <action cmd= "endscript" /> </sequence> </trigger> <trigger name= "msg_generic" > <condition type= "appmsg" > msg_generic </condition> <sequence> <action cmd= "showhtml" > generic_msg.htm </action> <action cmd= "triggeron" > msg_generic </action> </sequence> </trigger> <!-- A rendszer egy kezeletlen kivételt dob ​​a kemény kód oldaláról. --> <trigger name= "error_hardcodeside" > <condition type= "appmsg" > error_hardcodeside </condition> <sequence> <action cmd= "triggeroff" > * </action> <action cmd= "triggeron" > btnmainmenu </action> <action cmd= "triggeron" > btnquitapp </action> <action cmd= "disablenbb" > összes </action> <action cmd= "enablenbb" > főmenü </action> <action cmd= "showhtml" > errdsc_null.htm,Hata, @@İşlem sırasında bir hata meydana geldi.@@ </action> <action cmd= "waittrigger" > btnmainmenu </action> </sequence> </trigger> </edscript>

A dokumentumokkal való munka szabályozása: szabályok, nyelvek, programozási felületek

Ez a rész összefoglalja a W3C ajánlásainak néhány, a dokumentumokkal való munkával kapcsolatos rendelkezését. A megfelelő ajánlások vonatkozhatnak mind az XML dokumentumokra, mind a dokumentumok szélesebb osztályára. Általában hivatkozások találhatók a W3C által ajánlott dokumentumkezelő eszközökhöz.

Dokumentumkódolás

A specifikáció előírja, hogy a processzorok legalább két Unicode kódolást támogassanak: UTF-8 és UTF-16 .

XML processzor és alkalmazás

Az XML specifikáció meghatározza az XML processzor és az alkalmazás fogalmát . Az XML processzor ( parser ) egy olyan program, amely elemzi a jelöléseket, és egy dokumentum szerkezetére vonatkozó információkat továbbít egy másik programnak, egy alkalmazásnak.

Az XML-specifikáció bizonyos követelményeket támaszt a processzorral szemben, anélkül, hogy befolyásolná az alkalmazás követelményeit.

Érvényes dokumentum. Érvényesítő és nem ellenőrző processzorok

Egy bizonylat akkor érvényes , ha van hozzá társított bizonylattípus-definíció , és ha a bizonylat megfelel a bizonylattípus-definícióban szereplő megkötéseknek.

Az XML processzorok két osztályba sorolhatók: érvényesítő és nem érvényesítő.

Az érvényesítő processzorok ellenőrzik a dokumentum érvényességét, és jelenteniük kell (a felhasználó választása szerint) a dokumentumtípus-definícióban szereplő korlátozások megsértését.

A nem érvényesítő feldolgozók nem ellenőrzik a bizonylat érvényességét, de a fent említett irat-előfeldolgozási feladatok rájuk maradnak.

Dokumentumtípusok leírása: Sémanyelvek

A sémanyelvek a dokumentumtípusok leírására szolgálnak .  Mivel az XML az SGML nyelv egy részhalmaza , örökli az SGML-hez kifejlesztett dokumentumtípus-meghatározási ( DTD ) nyelvet. Később más sémanyelveket fejlesztettek ki, a legismertebb az XML Schema , a RELAX NG .

XML dokumentum konvertálása

Az XSLT -t arra tervezték, hogy megoldja az XML-dokumentumok másik sémává vagy más formátumba való átalakításának problémáját .

Dokumentum renderelési formátum

Formázott dokumentumhoz (megjelenítésre előkészített dokumentumhoz) az XSL-FO formátumot használják .

Lekérdezési nyelvek

Az XPath  egy szintaxis egy fa formájában ábrázolt dokumentum tartalmának címezésére. Az XPath kifejezések az XQuery nyelvben használatosak . Az XPath kifejezések általában minden olyan környezetben használhatók, ahol megfelelő a faelemekre való formális hivatkozások használata, különösen a dokumentumelérési interfészek metódusainak paramétereiként.

Az XQuery  egy dokumentum-orientált programozási nyelv.

XML olvasása: Három API

Három API -lehetőség létezik az XML olvasására [12] .

Event API ( eseményvezérelt API, push-stílusú API ) - XML-processzor olvassa az XML-t; egy bizonyos eseménynél (nyitó vagy záró címke, szöveges karakterlánc, attribútum megjelenése) a visszahívási függvény meghívódik.

  • + Kevés memóriát fogyaszt [12] .
  • + Hatalmas XML feldolgozásakor van egy szabványos pont, amely lehetővé teszi a kezelő azonnali leállítását [12] .
  • - Egy alkalmazásprogramozónak rendkívül nehéz: a memóriában kell tartani az információt, hogy a dokumentum melyik helyén vagyunk.
  • + A könyvtár könnyen programozható.
  • − Csak szekvenciális hozzáférés az XML -hez [13] , ami megnehezíti a kereszthivatkozások elemzését és a vegyes sorrendű XML "majdnem helyes" elemzését.
  • − Csak olvasható API, az íráshoz egy másik API szükséges [14] .
  • ± Természetes választás, ha kevés adatot kell kinyerni hatalmas XML-ből [12] .
  • ± A természetes választás, amikor az XML-t tartománystruktúrává kell konvertálni [12] .
  • Könyvtári példák: SAX , Expat
Mind az öt példa ezzel az XML-lel működik <?xml version="1.0" encoding="UTF-8" ?> <document> <thing name= "A" > Alpha </thing> <thing name= "B" > Bravo </thing> </document> Példa kódra (C++, kitalált API) enum class Hely { GYÖKÉR , DOKUMENTUM , DOLOG , N } Hely szülőPlace [ static_cast < int > ( Hely :: N )] = { ROOT , ROOT , DOCUMENT }; osztály MyEvent : nyilvános Xml :: Esemény { privát : Hely hely = Hely :: GYÖKÉR ; Thing * currThing = nullptr ; nyilvános : /// @return true — a címke szükséges; false - hagyja ki, és minden, ami a bool -on belül van, onTagOpen ( const std :: string & aName ) override ; void onTagClose () felülbírálása ; void onAttr ( const std :: string & aName , const std :: string & a Value ) override ; void onText ( const std :: string & aText ) felülírás ; } bool MyEvent :: onTagOpen ( const std :: string & aName ) { kapcsoló ( hely ) { tok Hely :: GYÖKÉR : if ( aName == "dokumentum" ) { hely = Hely :: DOKUMENTUM ; return true ; } szünet ; ügy Hely :: DOKUMENTUM : if ( aName == "dolog" ) { hely = Hely :: DOLOG ; currThing = & dolgok . emplace_back (); return true ; } szünet ; } return false ; } érvénytelen MyEvent :: onTagClose () { hely = szülőPlace [ hely ]; } void MyEvent :: onAttr ( const std :: string & aName , const std :: string & a Value ) { if ( hely == Hely :: DOLOG && aName == "név" ) currThing -> név = aÉrték ; } void MyEvent :: onText ( const std :: string & aText ) { if ( hely == Hely :: DOLOG ) currThing -> érték = aText ; } xml :: eventDrivenRead ( "in.xml" , MyEvent ());

Stream API (szintén pull-style API ) – I/O adatfolyamok módjára elrendezve . Az alkalmazás kódja az XML részeit kéri a processzortól, amely csak az XML-en keresztül haladhat előre, elfelejtve a már átadott részeket.

  • + Kevés memóriát fogyaszt.
  • + Az információt, hogy a dokumentum melyik helyén vagyunk, implicit módon a végrehajtási szálon belüli hely határozza meg . Ez nagyban leegyszerűsíti az alkalmazásprogramozó [15] [14] munkáját . A jól átgondolt API-kon a kód mennyisége megközelíti a DOM-ét.
  • − A könyvtár nehezen programozható.
  • + Lehetővé teszi két XML dokumentum egyidejű elérését [15] .
  • − Csak szekvenciális hozzáférés az XML -hez [14] , ami megnehezíti a kereszthivatkozások elemzését és a "majdnem helyes" XML vegyes sorrendű elemeit.
  • − Csak olvasható API, az íráshoz más API-ra lesz szükség. ( A StAX streaming is, de külön közvetlen írási API-ja is van [16] .)
  • Könyvtári példák: StAX
Példa kódra (C++, kitalált API) xml :: StreamReader olvasó ( "in.xml" ); std :: string név , érték ; olvasó . enterTag ( "dokumentum" ); while ( olvasó . getTag ( " dolog " ) { dolog dolog ; dolog . név = olvasó . requestStringAttr ( "név" ); olvasó . enterTag (); dolog . érték = olvasó . getText (); olvasó . leftTag (); dolgokat . emplace_back ( std :: move ( dolog )); }

Object API ( Document Object Model , DOM, "dokumentumobjektum modell") - beolvassa az XML-t, és objektumstruktúraként újra létrehozza a memóriában.

  • - Sok memóriát használ – sokkal többet, mint amennyit maga az XML a lemezen. A pugixml esetén a memóriafelhasználás az XML hosszának legalább háromszorosa.
  • + Egyszerű az alkalmazásprogramozó számára.
  • + A könyvtár könnyen programozható.
  • + Lehetővé teszi az XML-hez való véletlenszerű hozzáférést [12] . Ez például leegyszerűsíti a kereszthivatkozásokkal végzett munkát. Gyakran lehetséges a „majdnem helyes” XML felismerése a címkék zavaros sorrendjével.
  • + Közös API olvasáshoz és íráshoz [14] .
  • ± Természetes választás, ha a tartomány objektum maga az XML: webböngészőben [12] , XML szerkesztőben, importőrben egy lokalizáló programba , amely tetszőleges szerkezetű XML-ből kinyeri ki a stringeket.
  • ± Természetes választás, ha XML-t szeretne betölteni, kicsit átdolgozni és menteni [12] [14] . Azokhoz a részekhez, amelyekhez nem kell hozzányúlni, nincs szükség kódra.
  • Könyvtári példák: JDOM , TinyXML , pugixml
Példa kódra (C++, pugixml ) #include <iostream> #include <vektor> #include "pugixml.hpp" struct Thing { std :: string név , érték ; }; // Ha valamelyik pugixml entitást hamisként boollá alakítanak át, akkor adj ki hibát! sablon < classT > _ inline T need ( T && val , const char * errmsg ) { if ( ! val ) throw std :: logic_error ( errmsg ); return std :: előre < T > ( val ); } int main () { std :: vektor < Thing > dolgok ; pugi :: xml_document doc ; need ( doc . load_file ( "in.xml" ), "Nem lehet betölteni az XML-t!" ); auto elDocument = kell ( doc . root (). gyermek ( "dokumentum" ), "Szükség <dokumentum>" ); for ( pugi :: xml_node elThing : elDocument . children ( "dolog" ))) { auto attrName = need ( elThing . attribútum ( "név" ), "Kell <dolog>.név!" ); dolgokat . emplace_back ( Thing { attrName . as_string (), elThing . text (). as_string () } ); } for ( auto & v : things ) { std :: cout << v . név << "=" << v . érték << std :: endl ; } return 0 ; }

Léteznek hibrid API-k is: a külső és nem fontos részek beolvasása a stream metódussal történik, míg a belső és fontos részek az objektum metódussal.

Példa kódra (C++, kitalált API) xml :: StreamReader olvasó ( "in.xml" ); std :: string név , érték ; olvasó . enterTag ( "dokumentum" ); while ( olvasó . getTag ( " dolog " ) { xml :: Elem * elThing = olvasó . readEntireSubtree (); dolgokat . emplace_back (); Dolog és dolog = dolgok . vissza (); dolog . név = elThing . requestStringAttr ( "név" ); dolog . érték = elThing . szöveg (); }

XML írás: két API lehetőség

A Direct Write API címkénként, attribútumonként írja az XML-címkéket.

  • + Gyors, nincs köztes objektum.
  • − Egy primitív könyvtár szuboptimális XML-t jeleníthet meg (pl . <tag></tag>helyett <tag />). Az optimális munkavégzést sokkal nehezebb programozni.
  • − Bizonyos konkrét feladatokra alkalmatlan.
  • − Ha a tantárgyi struktúrák megbízhatatlanul működnek, különösebb intézkedések nélkül (memóriába vagy másik fájlba írás, majd átnevezés), akkor egy „ledőlt” program és egy fájl elvesztése lehet a vége.
  • − A programozói hiba szintaktikailag helytelen XML-t eredményezhet.
  • - Csak írható API, az olvasáshoz egy másik API szükséges.
  • Könyvtári példák: StAX .
Példa kódra (C++, kitalált API) xml :: Writer wri ( "out.xml" ); wri . openTag ( "dokumentum" ); for ( auto & v : things ) { wri . openTag ( "dolog" ); wri . writeAttr ( "név" , v . név ); wri . writeText ( v . érték ); wri . closeTag ( "dolog" ); } wri . closeTag ( "dokumentum" );

Object API , más néven Document Object Model .

  • − Objektumstruktúrát hoz létre az XML számára, amely több memóriát foglalhat el, mint egy tartománystruktúra.
  • ± Univerzális (a legtöbb feladatban azonban nincs előnye a direkt írás jól kidolgozott API-jával szemben - az olvasással ellentétben).
  • + Még akkor is, ha a tartományi struktúrák megbízhatatlanul működnek, és a programozó nem biztosított semmilyen "védelmet", az egyetlen forgatókönyv, amikor a fájlt egy hiányosra írják felül, egy I / O hiba (különösen a lemezterület hiánya).
  • + Egy jól megírt API-val lehetetlen szintaktikailag hibás XML-t létrehozni.
  • + Közös API íráshoz és olvasáshoz.
  • Könyvtári példák: ugyanaz, mint az XML olvasásakor DOM-módszerrel.
Példa kódra (C++, pugixml ) #include "pugixml.hpp" struct Thing { std :: string name , value ; }; Thing things [] { { "A" , "Alpha" , }, { "B" , "Bravo" , }, { "C" , "Charlie" } }; int main () { pugi :: xml_document doc ; auto root = doc . append_child ( "dokumentum" ); for ( auto & thing : things ) { autonode = root . _ append_child ( "dolog" ); csomópont . append_attribute ( "név" ) = dolog . név . c_str (); csomópont . append_child ( pugi :: node_pcdata ). set_value ( dolog . érték . c_str ()); } doki . save_file ( "teszt.xml" ); return 0 ; }

Dokumentumeszközök: elemzők, létrehozó és megjelenítő eszközök, adatbázisrendszerek

Elemző implementációk

Az XML minden modern programozási nyelvhez rendelkezik elemző implementációkkal [17] .

Webböngészők, mint dokumentum-megjelenítő eszköz

Renderelés CSS-stílusok használata nélkül

CSS vagy XSL használata nélkül az XML-dokumentum a legtöbb webböngészőben egyszerű szövegként jelenik meg. Egyes böngészők, például az Internet Explorer , a Mozilla Firefox és az Opera (az Opera beépített Dragonfly eszköze ) a dokumentumszerkezetet faként jelenítik meg, lehetővé téve a csomópontok összecsukását és kibontását egérkattintással.

CSS-stílusok alkalmazása

A folyamat hasonló a CSS -nek egy HTML -dokumentum megjelenítéséhez történő alkalmazásához. A böngészőben megjelenített CSS alkalmazásához az XML-dokumentumnak tartalmaznia kell egy speciális hivatkozást a stíluslapra. Például:

<?xml-stylesheet type="text/css" href="myStyleSheet.css"?>

Ez eltér a HTML megközelítéstől, amely a <link> elemet használja.

Transzformációk alkalmazása XSL-FO formátumra

A modern böngészők az XSLT-átalakításokat végrehajtó eszközök közé tartoznak. A böngészőben általában egy ilyen átalakítást hajtanak végre a dokumentum formázásához (a dokumentum átalakítása XSL-FO formátumba). Az XML-dokumentum prológusának következő utasítása utasítja a böngészőt a transform.xsl fájlban leírt XSLT-átalakítás végrehajtására:

<?xml-stylesheet type="text/xsl" href="transform.xsl"?>

XML szerkesztők

Egy XML-dokumentummal dolgozhat normál szövegszerkesztőben, de a normál szerkesztők nem támogatják a dokumentum szerkezetét. Vannak speciális XML-szerkesztők , amelyek kényelmesebbé és hatékonyabbá teszik a dokumentumokkal való munkát.

Adatbázis-kezelő rendszerek, amelyek XML formátumú adatokkal dolgoznak

A DB2 adatbázis-kezelő rendszer lehetővé teszi az adatok XML formátumban történő tárolását, és hozzáférést biztosít ezekhez az adatokhoz az XQuery nyelv használatával.

Hardver támogatás

Az XML-t alacsony hardver-, firmware- és szoftverszinten támogatják a modern hardvermegoldások [18] .

Hatály, korlátok, fejlesztési kilátások

Az XML használatának hatékonysága

Az XML egy jelölőnyelv, más szóval egy dokumentum leírásának eszköze. A dokumentumok, szövegek résében van, ahol a heterogén karakteradatok aránya nagy, és a jelölések aránya kicsi - az XML sikeres. Másrészt az adatcsere a nyílt rendszerekben nem korlátozódik a dokumentumok cseréjére. Az XML jelölés redundanciája (és nyelvi tervezési okokból kifejezetten kimondják, hogy a tömörség nem a projekt prioritása) olyan helyzeteket érint, amikor az adatok nem illeszkednek a hagyományos dokumentummodellbe. Az XML szintaxissal ( RSS , Atom formátumok ) formázott hírfolyam például nem a hagyományos értelemben vett dokumentum, hanem azonos típusú minidokumentumok folyama – a bőbeszédű és a redundáns jelölés ebben az esetben lényeges része. a továbbított adatokról.

A W3C aggódik az XML hatékonysága miatt, és az illetékes munkacsoportok vizsgálják ezt a kérdést (2013 elejéig még nem dolgoztak ki normatív dokumentumokat).

Egy másik helyzet, amikor az XML formátumok nem a legjobb megoldás, ha egyszerű szerkezetű és kis mennyiségű karakteres adattal (adatmezőkkel) dolgozunk. Ebben az esetben a jelölések aránya a teljes mennyiségben nagy, és az XML programozott feldolgozása indokolatlanul költséges lehet az egyszerűbb szerkezetű adatokkal való munkavégzéshez képest. Ezen a területen a fejlesztők olyan natív adatorientált eszközöket keresnek, mint az INI , YAML , JSON .

Szkriptnyelv XML-lel való munkához

A W3C egy szkriptnyelv létrehozásán dolgozik az XML-lel való munkavégzéshez (2013 elejére nem készültek szabályozási dokumentumok).

Lásd még

  • XML-RPC
  • XML séma
  • A SOAP ( Simple Object Access Protocol ) egy adatátviteli protokoll, amely az XML formátumot használja az üzenetekhez . 
  • PIHENÉS
  • Az XHTML a HTML  egy olyan változata , amely megfelel az XML szintaktikai követelményeinek.
  • Az XSD  egy nyelv az XML dokumentumok szerkezetének leírására.
  • FB2  - XML ​​alapú könyvleírás formátum
  • W3C DOM
  • DITA
  • WDDX
  • APML

Jegyzetek

  1. XML médiatípusok, RFC 3023 9–11. IETF (2001. január). Letöltve: 2010. január 4. Az eredetiből archiválva : 2011. augusztus 22..
  2. XML adathordozó típusok, RFC 3023 7–9. IETF (2001. január). Letöltve: 2010. január 4. Az eredetiből archiválva : 2011. augusztus 22..
  3. M. Murata, D. Kohn és C. Lilley. Internet Drafts: XML médiatípusok . IETF (2009. szeptember 24.). Letöltve: 2010. június 10. Az eredetiből archiválva : 2011. augusztus 22..
  4. Extensible Markup Language (XML) 1.0 (5. kiadás) . Letöltve: 2011. július 6. Az eredetiből archiválva : 2009. április 1..
  5. Extensible Markup Language (XML) 1.1 (második kiadás) . Letöltve: 2011. július 6. Az eredetiből archiválva : 2011. július 3..
  6. 1 2 Az "entitás" szó magyarázata az XML nyelvi specifikációban. . Letöltve: 2014. április 12. Az eredetiből archiválva : 2020. január 10.
  7. HTML-dokumentumábrázolás . www.w3.org. Letöltve: 2019. november 27. Az eredetiből archiválva : 2019. december 23.
  8. Az "érvényes" szó magyarázata a specifikációban. . Letöltve: 2014. április 12. Az eredetiből archiválva : 2020. január 10.
  9. A Backus-Naura űrlap használata a specifikációban. . Letöltve: 2014. április 12. Az eredetiből archiválva : 2020. január 10.
  10. Üres hely írása Backus - Naur formájában. . Letöltve: 2014. április 12. Az eredetiből archiválva : 2020. január 10.
  11. Ha mind a külső, mind a belső részhalmazt használjuk, a belső részhalmazt úgy kell tekinteni, hogy a külső részhalmaz előtt fordul elő.
  12. 1 2 3 4 5 6 7 8 Xml-es elemzés . Letöltve: 2019. augusztus 30. Az eredetiből archiválva : 2022. március 16.
  13. Streaming versus DOM (A Java EE 5 bemutatója) . Letöltve: 2022. április 9. Az eredetiből archiválva : 2022. április 9..
  14. 1 2 3 4 5 A StAX összehasonlítása más JAXP API-kkal (A Java EE 5 oktatóanyaga) . Letöltve: 2022. április 9. Az eredetiből archiválva : 2022. április 9..
  15. 1 2 Pull Parsing versus Push Parsing (A Java EE 5 oktatóanyaga) . Letöltve: 2022. április 9. Az eredetiből archiválva : 2022. április 9..
  16. StAX API (A Java™ oktatóanyagok > Java API XML-feldolgozáshoz (JAXP) > Streaming API for XML) . Letöltve: 2022. április 9. Az eredetiből archiválva : 2022. április 9..
  17. XML-elemzők (lefelé irányuló kapcsolat) . Letöltve: 2009. március 11. Az eredetiből archiválva : 2009. március 3.. 
  18. Intel XML Accelerator  (lefelé irányuló kapcsolat)

Irodalom

  • David Hunter, Jeff Rafter, Joe Faucette, Eric van der Vlist és társai, XML. Munka az XML-lel, 4. kiadás = XML kezdete, 4. kiadás. - M . : "Dialektika" , 2009. - 1344 p. — ISBN 978-5-8459-1533-7 .
  • David Hunter, Jeff Rafter és társai, XML. Alaptanfolyam = XML kezdete. — M .: Williams , 2009. — 1344 p. — ISBN 978-5-8459-1533-7 .
  • Tabor Róbert. Microsoft .NET XML webszolgáltatások megvalósítása = Microsoft .NET XML webszolgáltatások. - M .: Williams , 2002. - 464 p. - ISBN 0-672-32088-6 .

Linkek