XML

Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de versiunea revizuită la 3 iunie 2022; verificările necesită 3 modificări .
XML ( Engleză  eXtensible Markup Language ) limbaj de marcare extensibil
Extensie .xml
tip MIME application/xml [1] , text/xml [2] (depreciat într-o schiță expirată) [3]
Dezvoltator Consorțiul World Wide Web
publicat 1998
Tip de format limbaj de marcare
Extins din SGML
Dezvoltat în XHTML , RSS , Atom , KML , SVG și multe alte formate
Standard(e) 1.0 (Ediția a cincea), 26 noiembrie 2008 [4]
1.1 (Ediția a doua), 16 august 2006 [5]
format deschis ? da
Site-ul web w3.org/XML
 Fișiere media la Wikimedia Commons

XML ( MFA : [ ˌ e k s . e m ˈ e l ], prescurtare din engleză.  e X tensible Markup Language ) - „ limbaj de markup extensibil ”. Recomandat de World Wide Web Consortium (W3C). Specificația XML descrie documentele XML și descrie parțial comportamentul procesoarelor XML (programe care citesc documente XML și oferă acces la conținutul acestora). XML a fost conceput pentru a fi un limbaj cu o sintaxă formală simplă , ușor de creat și procesat documente atât pentru programe , cât și pentru oameni , cu accent pe utilizarea pe Internet. Limbajul se numește extensibil deoarece nu fixează markupul folosit în documente: dezvoltatorul este liber să creeze markup în funcție de nevoile unei anumite zone, fiind limitat doar de regulile de sintaxă ale limbajului. O extensie XML este o gramatică  concretă bazată pe XML și reprezentată de un dicționar de etichete și atributele acestora, precum și un set de reguli care definesc ce atribute și elemente pot fi conținute în alte elemente. Combinația dintre sintaxa formală simplă, ușurința umană, extensibilitatea și încrederea în codificări Unicode pentru reprezentarea conținutului documentelor a condus la utilizarea pe scară largă atât a XML-ului însuși, cât și a unei varietăți de limbaje specializate derivate din XML într-o mare varietate de instrumente software.

XML este un subset al SGML .

Limbajul XML

Specificația XML descrie limbajul și o serie de probleme privind codificarea și procesarea documentelor. Materialul din această secțiune este un rezumat al descrierii limbii din specificația XML, adaptată pentru acest articol.

Versiunea în limba engleză a documentului este considerată normativă, prin urmare termenii principali sunt dați împreună cu originalele lor în limba engleză.

Traducerea termenilor principali urmează, practic, traducerea Specificației în rusă disponibilă pe Internet, cu excepția termenilor etichetă și declarație . Pentru termenul etichetă, eticheta de traducere este folosită aici . Pentru termenul declarație, se acordă preferință declarației comune de traducere ( față de declarația comună, de asemenea, pe hârtie de calc ).

Alte traduceri ale termenilor principali pot fi găsite în literatură și pe Internet.

Structura fizică și logică a unui document

Din punct de vedere fizic, un document este format din entități , fiecare  dintre acestea putând face referire la o altă entitate. Unicul element rădăcină  este entitatea document . Conținutul entităților este simboluri.

Din punct de vedere logic, documentul este format din comentarii ( English  comments ), declarații ( English  declarations ), elemente ( English  elements ), referințe de entități ( English  character references ) și instrucțiuni de procesare ( English  processing instructions ). Toate acestea din document sunt structurate prin marcare . 

Structura fizică

O entitate  este cea mai mică parte dintr-un document. Toate entitățile conțin ceva și toate au un nume (există excepții, de exemplu document entity ). Mai simplu spus, termenul „esență” descrie „lucru existent”, „ ceva ” [6] .

Un document este format din entități al căror conținut este simboluri. Toate caracterele sunt împărțite în două tipuri: caractere de date (date de caractere în limba engleză  ) și caractere de marcare. Markup include:

  1. tags ( eng.  tags ) <- denotă marginile elementelor
  2. declarații și instrucțiuni de procesare, inclusiv atributele acestora ( atribute în limba engleză  )
  3. referințe de entitate
  4. comentarii
  5. precum și secvențe de caractere care încadrează secțiunile „ CDATA ” .

Partea non-markup a documentului este datele de caracter ale documentului.

Structura logică

Toate părțile constitutive ale documentului sunt rezumate în prolog și elementul rădăcină . Elementul rădăcină  este o parte obligatorie a documentului, care constituie întreaga sa esență (prologul, în general, poate fi absent). Elementul rădăcină poate include sau nu elementele sale imbricate, datele de caracter și comentariile. Elementele imbricate în elementul rădăcină pot include, la rândul lor, elemente imbricate, date de caracter și comentarii și așa mai departe. Prolog poate include declarații , instrucțiuni de procesare , comentarii . Ar trebui să înceapă cu o declarație XML , deși această declarație poate fi omisă în anumite situații.

Elementele de document trebuie să fie imbricate corespunzător : orice element care începe în interiorul altui element (adică orice element de document, altul decât elementul rădăcină) trebuie să se termine în interiorul elementului pe care a început. Datele de caractere pot apărea în cadrul elementelor fie direct, fie în secțiuni speciale „CDATA” . Declarațiile, instrucțiunile de procesare și elementele pot avea atribute asociate acestora. Atributele sunt folosite pentru a asocia perechile nume-valoare cu o unitate logică de text.

Simboluri de marcare

Markupul începe întotdeauna cu un caracter <și se termină cu un >.

Alături de simbolurile <și >, simbolul joacă și un rol special în marcare &. Parantezele unghiulare marchează granițele elementelor, instrucțiunilor de procesare și alte secvențe. Ampersand vă permite să înlocuiți text folosind entități ( entități engleze  ) [6] .

Tratarea ambiguității de marcare

Utilizarea caracterelor de marcare în datele de caractere face dificilă recunoașterea constructelor de marcare și poate crea o problemă de ambiguitate a structurii. În XML, această problemă este rezolvată după cum urmează: <, > și & nu pot fi prezente în datele de caracter și în valorile atributelor în forma lor directă, entitățile speciale sunt rezervate pentru reprezentarea lor în aceste cazuri :

Simbol Înlocuire
< <
> >
& &

În plus, următoarele entități sunt folosite pentru a folosi apostrofe și ghilimele în cadrul valorilor atributelor :

' '
" "

Regula de înlocuire a caracterelor de marcare cu entitățile lor care denotă nu se aplică datelor de caractere din secțiunile „CDATA”, ci se realizează în toate celelalte locuri din document.

Referințe de caractere numerice

Referințele de caractere numerice indică poziția codului caracterului în setul de caractere al documentului. Referințele de caractere numerice pot lua două forme [7] :

  1. sintaxa „ &#D; ”, unde D este un număr zecimal;
  2. sintaxa " &#xH; " sau " &#XH; ”, unde H este un număr hexazecimal (numerele hexazecimale din referințele numerice simbolice nu sunt sensibile la majuscule).

Exemple de referințe de caractere numerice:

  • å  - (în formă zecimală) reprezintă litera „a” cu un cerc mic deasupra ei (folosită, de exemplu, în norvegiană);
  • å  - (în hexazecimal) reprezintă același caracter;
  • å  - (în hexazecimal) reprezintă și același caracter;
  • И  — (în formă zecimală) reprezintă litera majusculă chirilică „I”;
  • 水  - (în hexazecimal) reprezintă caracterul chinezesc pentru „apă”;

Nume

În XML, toate numele trebuie să înceapă cu o literă, caracterul de subliniere (_) și să continue doar cu caracterele care sunt permise pentru nume, și anume: pot conține doar litere care fac parte din secțiunea de litere Unicode, cifre arabe, cratime, litere de subliniere. , puncte. Deoarece literele nu se limitează doar la caractere ASCII, literele din orice limbă pot fi folosite în nume.

Prolog

Declarație XML

O declarație XML specifică versiunea lingvistică în care este scris documentul. Deoarece interpretarea conținutului unui document depinde de versiunea limbii, specificația prescrie să înceapă documentul cu o declarație XML. În prima versiune (1.0) a limbii, utilizarea declarației a fost opțională, în versiunile ulterioare este obligatorie. Astfel, versiunea lingvistică este determinată din declarație, iar dacă nu există declarație, se presupune versiunea 1.0.

Pe lângă versiunea XML, declarația poate conține și informații despre codificarea documentului și „dacă documentul ar trebui să rămână cu propriul DTD sau cu unul inclus”.

Exemplu:

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

sau:

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

În toate aceste exemple, lipsea atributul „autonom”, care determină doar dacă să includă descrieri de markup în document din exterior. Setarea implicită la „nu”:

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

dacă documentul XML face referire la alte DTD-uri care descriu ce poate conține documentul, trebuie să specificațistandalone="no"

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

dacă documentul XML nu se referă la alte fișiere și va folosi propriul DTD, trebuie să specificațistandalone="yes"

Declarație tip document

Există o instrucțiune specială pentru declararea unui tip de document !DOCTYPE. Vă permite să specificați, folosind limbajul DTD, ce elemente sunt incluse în document, care sunt atributele acestora, ce entități pot fi utilizate și altceva.

De exemplu, iată documentul corect:

<?xml version="1.0"?> <salutare> Bună ziua, lume! </salutare>

Are un element rădăcină <greeting>Hello, world!</greeting>și, în mod logic, documentul există. Totuși, nu este valabil ( ing.  invalid ) [8] .

Cu ajutorul unei declarații de tip de document (DTD), este posibil să se descrie conținutul și structura logică a acestuia, precum și să se asocieze o pereche nume-valoare cu un anumit element. Iată cum arată prologul în intrarea Backus-Naur [9] :

prolog ::= XMLDecl? Misc* (doctypedecl Misc*)? XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' VersionInfo ::= S 'versiune' Eq ("'" VersionNum "'" | '"' VersionNum '"') Eq ::= S? '='S? VersionNum ::= '1.' [0-9]+ Diverse ::= Comentariu | PI | S doctypedecl ::= '<!DOCTYPE' S Nume (S ExternalID)? S? ('[' intSubset ']' S?)? '>' DeclSep ::= PEReferință | S intSubset ::= (markupdecl | DeclSep)* markupdecl ::= elementdecl | AttlistDecl | EntityDecl | Notație Decl | PI | cometariu extSubset ::= TextDecl? extSubsetDecl extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)*

Declarația XML poate fi urmată de comentarii, instrucțiuni de procesare sau spații goale [10] , dar apoi vine Declarațiile de tip de document, unde „Nume” este numele etichetei rădăcină , „ExternalID” este identificatorul extern și „intSubset” este declarația de markup sau, altfel, referința la entitate. După cum spune specificația, dacă un identificator extern este declarat împreună cu o declarație internă, atunci aceasta din urmă vine înaintea primei [11] .

De exemplu:

<?xml version="1.0"?> <!DOCTYPE greeting SYSTEM "hello.dtd"> <greeting> Bună, lume! </salutare>

Aici „ SYSTEM "hello.dtd"” este un identificator extern: adresa „hello.dtd” vă permite să utilizați datele din documentul „hello.dtd” ca declarații de markup.

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE salut [ <!ELEMENT greeting (#PCDATA)> ]> <felicitare> Bună, lume! </salutare>

Aici marcajul a fost declarat local în !DOCTYPE.

Instrucțiune de procesare

Instrucțiuni de procesare ( ing.  instrucțiuni de procesare, PI ), vă permit să plasați instrucțiuni pentru aplicații în document. Următorul exemplu arată o instrucțiune de procesare xml-stylesheet care transmite instrucțiunile din fișierul my-style.css unei aplicații xml-stylesheet (cum ar fi un browser) prin atributul href:

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

Comentariile ( ing.  comentariu ) nu se referă la datele de caractere ale documentului. Comentariul începe cu secvența „<!--” și se termină cu secvența „-->”, combinația de caractere „--” nu poate apărea în interior. Caracterul & nu este folosit ca marcaj în interiorul unui comentariu.

Exemplu:

<!-- acesta este un comentariu -->

Element rădăcină

Elementul și marcajul său

Un element este un  concept al structurii logice a unui document. Fiecare document conține unul sau mai multe elemente. Granițele elementelor sunt reprezentate de etichete de început și de sfârșit . Numele elementului din etichetele de început și de sfârșit ale elementului trebuie să se potrivească. Un element poate fi reprezentat și printr -o etichetă de element goală , adică care nu include alte elemente și date de caractere.

Tag ( eticheta engleză  ) este o construcție de marcare care conține numele unui element.

Eticheta de pornire: <element1>

Etichetă de final: </element1>

Etichetă de element goală: <empty_element1 />

Într-un element, atributele pot fi utilizate numai în eticheta de început și eticheta de element goală.

Un exemplu de rețetă marcată cu XML:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE recipe> <recipe name= "bread" preptime= "5min" cooktime= "180min" > <titlu> pâine simplă </title> <composition> <ingredient amount= "3" unit= "glass" > Făină </ingredient> <ingredient amount= "0,25" unit= "gram" > Drojdie </ingredient> <ingredient amount= "1,5" unit= "sticlă" > Apă caldă </ingredient> </composition> <instructions> <step> Se amestecă toate ingredientele și se frământă bine. </step> <step> Închideți cu o cârpă și lăsați timp de o oră într-o cameră caldă. </step> <!-- <step> Citiți ziarul de ieri. </step> este un pas dubios... --> <step> Se framanta din nou, se pune pe o tava de copt si se da la cuptor. </step> </instructions> </recipe> Secțiunea CDATA

Secțiunea CDATA nu este o unitate logică de text. O secțiune poate apărea oriunde într-un document unde sintaxa permite plasarea datelor de caractere. Secțiunea începe <![CDATA[și se termină ]]>. Între acest marcaj sunt date de caractere; datele de caractere includ astfel caracterele < > &în forma lor imediată.

Document corect

Un document bine format respectă toate regulile generale de sintaxă XML aplicabile oricărui document XML : structură  corectă a documentului, nume care se potrivesc în eticheta elementului de început și de sfârșit etc. Un document care nu este bine format nu poate fi considerat un document xml.

Spații de nume

Exemplu de document:

<?xml version="1.0" encoding="UTF-8"?> <!-- ecran de conectare --> <edsscript> <sequence name= "start" > <action cmd= "triggeron" > bt* </action> <action cmd= "triggeron" > msg_generic </action> <action cmd= "disablenbb" > toate </action> <action cmd= "setscrtext" > @@Sistem Giris@@ </action> <action cmd= "enablenbb" > înainte, meniul principal </action> <action cmd= "switchmsgtarget" > LOGIN_DLG </action> <action cmd= "sendmsg" > start </action> <action cmd= "sări" > pasul 2 </action> </sequence> <sequence name= "step2" > <action cmd= "waittrigger" > btnforward </action> <action cmd= "triggeron" > Autentificare* </action> <action cmd= "disablenbb" > toate </action> <action cmd= "sendmsg" > Verifica </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" > toate </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" > înapoi </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "sări" > start </action> </sequence> </trigger> <trigger name= "login_incorrectpwd" > <condition type= "appmsg" > login_incorrectpwd </condition> <sequence name= "login_incorrectpwd" > <action cmd= "disablenbb" > toate </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" > înapoi </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "sări" > start </action> </sequence> </trigger> <!-- generic triggers --> <trigger name= "btnback" > <condition type= "buttonclick" > înapoi </condition> <sequence name= "btnback" > <action cmd= "triggeron" > btnback </action> </sequence> </trigger> <trigger name= "btnforward" > <condition type= "buttonclick" > redirecţiona </condition> <sequence name= "btnforward" > <action cmd= "triggeron" > btnforward </action> </sequence> </trigger> <trigger name= "btnmainmenu" > <condition type= "buttonclick" > meniu principal </condition> <sequence> <action cmd= "jumpscript" > <value label= "mainmenuscript" scope= "local" /> </action> </sequence> </trigger> <trigger name= "btnquitapp" > < tipul de condiție = „buttonclick” > renunta la aplicare </condition> <sequence name= "btnquitapp" > <action cmd= "callscript" > quitapp.xml </action> <action cmd= "sări" > start </action> </sequence> </trigger> <trigger name= "error_generic" > <condition type= "appmsg" > eroare* </condition> <sequence> <action cmd= "showhtml" > errdsc_null.htm,@@Hata@@ </action> <action cmd= "disablenbb" > toate </action> <action cmd= "enablenbb" > redirecţiona </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> <!-- O excepție netratată este aruncată din partea codului hard. --> <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" > toate </action> <action cmd= "enablenbb" > meniu principal </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>

Reglementarea lucrului cu documente: reguli, limbaje, interfețe de programare

Această secțiune conține un rezumat al unora dintre prevederile recomandărilor W3C legate de lucrul cu documente. Recomandările corespunzătoare se pot aplica atât documentelor XML, cât și clasei mai largi de documente. De obicei, sunt furnizate link-uri către instrumentele de gestionare a documentelor recomandate de W3C.

Codificarea documentului

Specificația necesită ca procesoarele să accepte cel puțin două codificări Unicode: UTF-8 și UTF-16 .

Procesor și aplicație XML

Specificația XML definește conceptele unui procesor XML și o aplicație . Un procesor XML ( parser ) este un program care analizează marcajul și transmite informații despre structura unui document către un alt program, o aplicație.

Specificația XML impune anumite cerințe procesorului fără a afecta cerințele aplicației.

Document valabil. Procesoare care validează și nu verifică

Un document este valabil dacă are asociată o definiție a tipului de document și dacă documentul respectă constrângerile prezentate în definiția tipului de document.

Procesoarele XML sunt împărțite în două clase: validare și nevalidare.

Procesatorii de validare verifică valabilitatea documentului și trebuie să raporteze (la alegerea utilizatorului) încălcările constrângerilor menționate în definiția tipului de document.

Procesatorii care nu validează nu verifică valabilitatea documentului, dar sarcinile de preprocesare a documentelor menționate mai sus le rămân.

Descrierea tipurilor de documente: limbaje de schemă

Limbajele de schemă sunt folosite pentru a descrie tipurile de documente .  Deoarece XML este un subset al limbajului SGML , moștenește limbajul Document Type Definition ( DTD ) dezvoltat pentru SGML. Ulterior, au fost dezvoltate și alte limbaje de schemă, cel mai cunoscut fiind XML Schema , RELAX NG .

Convertirea unui document XML

XSLT este conceput pentru a rezolva problema transformării unui document XML într-o altă schemă sau alt format .

Format de redare a documentului

Pentru un document formatat (un document pregătit pentru randare), formatul XSL-FO este destinat .

Limbi de interogare

XPath  este o sintaxă pentru adresarea conținutului unui document reprezentat sub formă de arbore. Expresiile XPath sunt folosite în limbajul XQuery . Expresiile XPath pot fi utilizate în general în orice context în care este adecvat să se utilizeze referințe formale la elementele arborelui, în special ca parametri ai metodelor de interfețe de acces la documente.

XQuery  este un limbaj de programare orientat spre documente.

Citirea XML: Trei API-uri

Există trei opțiuni API pentru citirea XML [12] .

API de evenimente ( API -ul de evenimente, API-ul de tip push ) - procesorul XML citește XML; la un anumit eveniment (apariția unei etichete de deschidere sau de închidere, șir de text, atribut), este apelată funcția de apel invers .

  • + Consumă puțină memorie [12] .
  • + Când procesați XML uriaș, există un punct standard care vă permite să opriți instantaneu handlerul [12] .
  • - Este extrem de dificil pentru un programator de aplicatii: trebuie sa pastrezi in memorie informatiile in ce loc al documentului ne aflam.
  • + Biblioteca este ușor de programat.
  • − Numai accesul secvenţial la XML [13] , acest lucru face dificilă analizarea referinţelor încrucişate şi „aproape corectarea” XML cu o ordine mixtă a elementelor.
  • − API numai pentru citire, scrierea va necesita un alt API [14] .
  • ± O alegere naturală atunci când puține date trebuie extrase din XML uriaș [12] .
  • ± Alegerea naturală atunci când XML trebuie convertit într-o structură de domeniu [12] .
  • Exemple de bibliotecă: SAX , Expat
Toate cele cinci exemple funcționează cu acest XML <?xml version="1.0" encoding="UTF-8" ?> <document> <thing name= "A" > Alpha </thing> <thing name= "B" > Bravo </thing> </document> Exemplu de cod (C++, API fictiv) enum class Locul { RĂDĂDINA , DOCUMENT , LUCR , N } Place parentPlace [ static_cast < int > ( Place :: N )] = { ROOT , ROOT , DOCUMENT }; clasa MyEvent : public Xml :: Eveniment { privat : Loc loc = Loc :: RĂDĂDINA ; Thing * currThing = nullptr ; public : /// @return true — este necesară eticheta; false - sări peste el și tot ce este în interiorul bool onTagOpen ( const std :: șir & aName ) override ; void onTagClose () suprascrie ; void onAttr ( const std :: string & aName , const std :: string & aValue ) override ; void onText ( const std :: string & aText ) override ; } bool MyEvent :: onTagOpen ( const std :: string & aName ) { comutator ( loc ) { caz Locul :: ROOT : if ( unNume == „document” ) { loc = Locul :: DOCUMENT ; returnează adevărat ; } rupe ; caz Locul :: DOCUMENT : if ( unNume == „lucru” ) { loc = Loc :: LUCR ; currThing = & lucruri . plasează_înapoi (); returnează adevărat ; } rupe ; } returnează fals ; } void MyEvent :: onTagClose () { loc = parentPlace [ loc ]; } void MyEvent :: onAttr ( const std :: string & aName , const std :: string & aValue ) { if ( loc == Locul :: THING && aName == „nume” ) currThing -> nume = aValue ; } void MyEvent :: onText ( const std :: string & aText ) { dacă ( loc == Loc :: LUCR ) currThing -> valoare = aText ; } xml :: eventDrivenRead ( "in.xml" , MyEvent ());

Stream API (de asemenea, pull-style API ) - aranjat în maniera fluxurilor I/O . Codul aplicației cere procesorului părți din XML, care se pot deplasa înainte doar prin XML, uitând părțile deja trecute.

  • + Consumă puțină memorie.
  • + Informația, în ce loc al documentului ne aflăm, este implicit stabilită de locul din firul de execuție . Acest lucru simplifică foarte mult munca programatorului de aplicații [15] [14] . Pe API-urile bine gândite, cantitatea de cod se apropie de cea a DOM.
  • − Biblioteca este greu de programat.
  • + Permite accesul simultan la două documente XML [15] .
  • − Numai accesul secvențial la XML [14] , acest lucru face dificilă analizarea referințelor încrucișate și „aproape corectarea” XML cu o ordine mixtă a elementelor.
  • − API numai pentru citire, scrierea va necesita un alt API. ( StAX , deși este și unul de streaming, are un API de scriere directă separat [16] .)
  • Exemple de bibliotecă: StAX
Exemplu de cod (C++, API fictiv) xml :: Cititor StreamReader ( "in.xml" ); std :: nume șir , valoare ; cititor . enterTag ( "document" ); în timp ce ( cititor . getTag ( „lucru” ) { chestie ; _ lucru . nume = cititor . requireStringAttr ( "nume" ); cititor . enterTag (); lucru . valoare = cititor . getText (); cititor . leaveTag (); lucruri . emplace_back ( std :: mutare ( lucru )); }

Object API ( Document Object Model , DOM, „document object model”) - citește XML și îl recreează în memorie ca structură de obiect.

  • - Utilizează multă memorie - mult mai mult decât ocupă XML-ul în sine pe disc. Pe pugixml , consumul de memorie este de trei ori sau mai mult decât lungimea XML.
  • + Ușor pentru programatorul de aplicații.
  • + Biblioteca este ușor de programat.
  • + Permite accesul aleatoriu la XML [12] . Acest lucru, de exemplu, simplifică munca cu referințe încrucișate. Adesea este posibil să recunoașteți XML „aproape corect” cu o ordine confuză a etichetelor.
  • + API comun pentru citire și scriere [14] .
  • ± O alegere firească atunci când obiectul de domeniu este XML însuși: într-un browser web [12] , editor XML, într-un importator într-un program de localizare care extrage șiruri din XML cu o structură arbitrară.
  • ± Alegerea naturală atunci când doriți să încărcați XML, să reluați ușor și să salvați [12] [14] . Acele părți care nu trebuie atinse nu necesită niciun cod.
  • Exemple de biblioteci: JDOM , TinyXML , pugixml
Exemplu de cod (C++, pugixml ) #include <iostream> #include <vector> #include „pugixml.hpp” struct Thing { std :: nume șir , valoare ; }; // Dacă o entitate pugixml este convertită în bool ca false, aruncați o eroare! șablon < classT > _ nevoie de T inline ( T && val , const char * errmsg ) { if ( ! val ) throw std :: logic_error ( errmsg ); return std :: forward < T > ( val ); } int main () { std :: vector < Lucru > lucruri ; pugi :: xml_document doc ; nevoie ( doc . load_file ( " in.xml " ), " Nu se poate încărca XML!" ); auto elDocument = nevoie ( doc . root ( ). child ( " document " ), " Need < document>" ); pentru ( pugi :: xml_node elThing : elDocument . copii ( "lucru" ) )) { auto attrName = nevoie ( elThing . atribut ( „nume” ), „Nevoie <lucru>.nume!” ); lucruri . emplace_back ( Lucrul { attrName . as_string (), elThing . text (). as_string () } ); } pentru ( auto & v : lucruri ) { std :: cout << v . nume << "=" << v . valoare << std :: endl ; } returnează 0 ; }

Există și API-uri hibride: părțile externe și neimportante sunt citite prin metoda stream, în timp ce părțile interne și importante sunt citite prin metoda obiect.

Exemplu de cod (C++, API fictiv) xml :: Cititor StreamReader ( "in.xml" ); std :: nume șir , valoare ; cititor . enterTag ( "document" ); în timp ce ( cititor . getTag ( „lucru” ) { xml :: Element * elThing = cititor . readEntireSubtree (); lucruri . plasează_înapoi (); Lucru și lucru = lucruri . spate (); lucru . nume = elThing . requireStringAttr ( "nume" ); lucru . valoare = elThing . text (); }

Scriere XML: două opțiuni API

API-ul Direct Write scrie etichetă XML cu etichetă, atribut cu atribut.

  • + Rapid, fără obiecte intermediare.
  • − O bibliotecă primitivă poate reda XML suboptim (de exemplu <tag></tag>, în loc de <tag />). Lucrul optim este mult mai dificil de programat.
  • − Nepotrivit pentru anumite sarcini specifice.
  • − Dacă structurile subiectului funcționează nesigur, fără măsuri speciale (scrieți în memorie sau într-un alt fișier, apoi redenumiți), puteți ajunge la un program „căzut” și un fișier pierdut.
  • − Eroarea unui programator poate avea ca rezultat XML incorect din punct de vedere sintactic.
  • - API numai pentru scriere, citirea va necesita un alt API.
  • Exemple de bibliotecă: StAX .
Exemplu de cod (C++, API fictiv) xml :: Writer Wri ( "out.xml" ); wri . openTag ( "document" ); pentru ( auto & v : lucruri ) { wri . openTag ( "lucru" ); wri . writeAttr ( "nume" , v . nume ); wri . scrieText ( v . valoare ); wri . closeTag ( "lucru" ); } wri . closeTag ( "document" );

Object API alias Document Object Model .

  • − Creează o structură de obiecte pentru XML, care poate ocupa mai multă memorie decât o structură de domeniu.
  • ± Universal (cu toate acestea, în majoritatea sarcinilor nu există niciun avantaj față de un API bine dezvoltat de scriere directă - spre deosebire de citire).
  • + Chiar dacă structurile de domeniu funcționează nesigur, iar programatorul nu a oferit nicio „protecție”, singurul scenariu în care fișierul este suprascris cu unul incomplet este o eroare I/O (în special, lipsa spațiului pe disc).
  • + Cu un API bine scris, este imposibil să creați XML incorect din punct de vedere sintactic.
  • + API comun pentru scriere și citire.
  • Exemple de bibliotecă: la fel ca și pentru citirea XML prin metoda DOM.
Exemplu de cod (C++, pugixml ) #include „pugixml.hpp” struct Thing { std :: nume șir , valoare ; }; Lucruri de lucru [] { { "A" , "Alpha" , }, { "B" , "Bravo" , }, { "C" , "Charlie" } }; int main () { pugi :: xml_document doc ; auto root = doc . append_child ( "document" ); pentru ( auto & lucru : lucruri ) { autonode = root . _ append_child ( "lucru" ); nod . append_attribute ( "nume" ) = lucru . nume . c_str (); nod . append_child ( pugi :: node_pcdata ). set_value ( lucru . valoare . c_str ()); } doc . save_file ( "test.xml" ); returnează 0 ; }

Instrumente pentru documente: analizatoare, instrumente de creare și vizualizare, sisteme de baze de date

Implementări parser

XML are implementări de parser pentru toate limbajele de programare moderne [17] .

Browsere web ca instrument de redare a documentelor

Redare fără a utiliza stiluri CSS

Fără utilizarea CSS sau XSL , documentul XML este redat ca text simplu în majoritatea browserelor web. Unele browsere, cum ar fi Internet Explorer , Mozilla Firefox și Opera ( instrumentul Dragonfly încorporat în Opera ) afișează structura documentului ca un arbore, permițând restrângerea și extinderea nodurilor cu clicuri de mouse.

Aplicarea stilurilor CSS

Procesul este similar cu aplicarea CSS unui document HTML pentru afișare. Pentru a aplica CSS atunci când este afișat într-un browser, documentul XML trebuie să conțină un link special către foaia de stil. De exemplu:

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

Aceasta este diferită de abordarea HTML, care utilizează elementul <link>.

Aplicarea transformărilor în format XSL-FO

Browserele moderne se numără printre instrumentele care pot efectua transformări XSLT. În browser, o astfel de transformare este de obicei efectuată pentru a formata documentul (conversia documentului în format XSL-FO). Următoarea declarație din prologul documentului XML instruiește browserul să efectueze transformarea XSLT descrisă în fișierul transform.xsl:

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

Editore XML

Puteți lucra cu un document XML într-un editor de text obișnuit, dar editorii obișnuiți nu acceptă structura documentului. Există editori XML speciali care fac lucrul cu un document mai convenabil și mai eficient.

Sisteme de gestionare a bazelor de date care lucrează cu date în format XML

Sistemul de management al bazei de date DB2 vă permite să stocați date în format XML și oferă acces la astfel de date folosind limbajul XQuery.

Suport hardware

XML este suportat la nivelurile scăzute de hardware, firmware și software în soluțiile hardware moderne [18] .

Domeniu de aplicare, limitări, perspective de dezvoltare

Eficacitatea utilizării XML

XML este un limbaj de marcare, cu alte cuvinte, un mijloc de descriere a unui document. Este în nișa documentelor, textelor, unde ponderea datelor de caractere eterogene este mare, iar cota de markup este mică - XML ​​​​are succes. Pe de altă parte, schimbul de date în sisteme deschise nu se limitează la schimbul de documente. Redundanța marcajului XML (și în scopuri de proiectare a limbajului, se precizează în mod explicit că concizia nu este o prioritate a proiectului) afectează situațiile în care datele nu se încadrează în modelul tradițional de document. Un flux de știri, de exemplu, formatat folosind sintaxa XML ( RSS , formate Atom ), nu este un document în sensul tradițional, ci un flux de același tip de mini-documente - marcajul verbos și redundant în acest caz este o parte esențială a datelor transmise.

W3C este preocupat de eficacitatea XML, iar grupurile de lucru relevante analizează această problemă (de la începutul anului 2013, nu au fost elaborate documente normative).

O altă situație în care formatele XML ar putea să nu fie cea mai bună soluție este atunci când lucrați cu date cu o structură simplă și o cantitate mică de date de caractere (câmpuri de date). În acest caz, ponderea markupului în volumul total este mare, iar procesarea programatică a XML poate fi nerezonabil de costisitoare în comparație cu lucrul cu date cu o structură mai simplă. În acest domeniu, dezvoltatorii se uită la instrumente native orientate spre date, cum ar fi INI , YAML , JSON .

Limbajul de scriptare pentru lucrul cu XML

W3C lucrează la crearea unui limbaj de scripting pentru lucrul cu XML (până la începutul anului 2013 nu au fost elaborate documente de reglementare).

Vezi și

  • XML-RPC
  • Schema XML
  • SOAP ( Simple Object Access Protocol ) este un protocol de transfer de date care utilizează formatul XML pentru mesaje . 
  • ODIHNĂ
  • XHTML  este o versiune de HTML care se conformează cerințelor de sintaxă ale XML.
  • XSD  este un limbaj pentru descrierea structurii documentelor XML.
  • FB2  - format de descriere a cărții bazat pe XML
  • W3C DOM
  • DITA
  • WDDX
  • APML

Note

  1. XML Media Types, RFC 3023 9–11. IETF (ianuarie 2001). Consultat la 4 ianuarie 2010. Arhivat din original pe 22 august 2011.
  2. XML Media Types, RFC 3023 7–9. IETF (ianuarie 2001). Consultat la 4 ianuarie 2010. Arhivat din original pe 22 august 2011.
  3. M. Murata, D. Kohn și C. Lilley. Internet Drafts: XML Media Types . IETF (24 septembrie 2009). Consultat la 10 iunie 2010. Arhivat din original pe 22 august 2011.
  4. Extensible Markup Language (XML) 1.0 (Ediția a cincea) . Preluat la 6 iulie 2011. Arhivat din original la 1 aprilie 2009.
  5. Extensible Markup Language (XML) 1.1 (Ediția a doua) . Preluat la 6 iulie 2011. Arhivat din original la 3 iulie 2011.
  6. 1 2 Explicația cuvântului „entitate” din specificația limbajului XML. . Consultat la 12 aprilie 2014. Arhivat din original la 10 ianuarie 2020.
  7. Reprezentare document HTML . www.w3.org. Consultat la 27 noiembrie 2019. Arhivat din original la 23 decembrie 2019.
  8. Explicația cuvântului „valid” din caietul de sarcini. . Consultat la 12 aprilie 2014. Arhivat din original la 10 ianuarie 2020.
  9. Utilizarea formularului Backus-Naura în specificație. . Consultat la 12 aprilie 2014. Arhivat din original la 10 ianuarie 2020.
  10. Scrierea unui spațiu liber sub formă de Backus - Naur. . Consultat la 12 aprilie 2014. Arhivat din original la 10 ianuarie 2020.
  11. Dacă sunt utilizate atât subseturile externe, cât și cele interne, subsetul intern TREBUIE să fie considerat a avea loc înainte de subsetul extern.
  12. 1 2 3 4 5 6 7 8 Analiza Xml . Preluat la 30 august 2019. Arhivat din original la 16 martie 2022.
  13. Streaming versus DOM (Tutorialul Java EE 5) . Consultat la 9 aprilie 2022. Arhivat din original pe 9 aprilie 2022.
  14. 1 2 3 4 5 Compararea StAX cu alte API-uri JAXP (Tutorialul Java EE 5) . Consultat la 9 aprilie 2022. Arhivat din original pe 9 aprilie 2022.
  15. 1 2 Pull Parsing versus Push Parsing (Tutorialul Java EE 5) . Consultat la 9 aprilie 2022. Arhivat din original pe 9 aprilie 2022.
  16. API StAX (Tutorialele Java™ > API-ul Java pentru procesare XML (JAXP) > API-ul de streaming pentru XML) . Consultat la 9 aprilie 2022. Arhivat din original pe 9 aprilie 2022.
  17. Analizoare XML (downlink) . Consultat la 11 martie 2009. Arhivat din original pe 3 martie 2009. 
  18. Intel XML Accelerator  (link în jos)

Literatură

  • David Hunter, Jeff Rafter, Joe Faucette, Eric van der Vlist și colab. XML. Lucrul cu XML, ediția a 4-a = XML început, ediția a 4-a. - M . : „Dialectica” , 2009. - 1344 p. — ISBN 978-5-8459-1533-7 .
  • David Hunter, Jeff Rafter și colab. XML. Curs de bază = XML început. — M. : Williams , 2009. — 1344 p. — ISBN 978-5-8459-1533-7 .
  • Robert Tabor. Implementare Microsoft .NET XML Web Services = Microsoft .NET XML Web Services. - M. : Williams , 2002. - 464 p. - ISBN 0-672-32088-6 .

Link -uri