XML

Aktuální verze stránky ještě nebyla zkontrolována zkušenými přispěvateli a může se výrazně lišit od verze recenzované 3. června 2022; kontroly vyžadují 3 úpravy .
XML ( anglicky  eXtensible Markup Language ) rozšiřitelný značkovací jazyk
Rozšíření .xml
MIME typ application/xml [1] , text/xml [2] (zastaralé v konceptu, jehož platnost vypršela) [3]
Vývojář World Wide Web konsorcium
zveřejněno 1998
Typ formátu značkovací jazyk
Rozšířeno z SGML
Vyvinutý v XHTML , RSS , Atom , KML , SVG a mnoho dalších formátů
standard(y) 1.0 (páté vydání), 26. listopadu 2008 [4]
1.1 (druhé vydání), 16. srpna 2006 [5]
otevřený formát ? Ano
webová stránka w3.org/XML
 Mediální soubory na Wikimedia Commons

XML ( MFA : [ ˌ e k s . e m ˈ e l ], zkr. z angličtiny.  e X tensible Markup L jazyk ) - "rozšiřitelný značkovací jazyk ". Doporučeno konsorciem World Wide Web (W3C). Specifikace XML popisuje dokumenty XML a částečně popisuje chování procesorů XML (programů, které čtou dokumenty XML a poskytují přístup k jejich obsahu). XML bylo navrženo jako jazyk s jednoduchou formální syntaxí , snadno vytvářet a zpracovávat dokumenty pro programy i lidi , s důrazem na použití na internetu. Jazyk se nazývá rozšiřitelný, protože neopravuje značkování používané v dokumentech: vývojář může volně vytvářet značkování podle potřeb konkrétní oblasti, přičemž je omezen pouze pravidly syntaxe jazyka. Rozšíření XML  je konkrétní gramatika založená na XML a reprezentovaná slovníkem značek a jejich atributů a také sadou pravidel, která definují, které atributy a prvky mohou být obsaženy v jiných prvcích. Kombinace jednoduché formální syntaxe, uživatelsky přívětivého přístupu, rozšiřitelnosti a spoléhání se na kódování Unicode pro reprezentaci obsahu dokumentů vedla k širokému použití jak samotného XML, tak řady specializovaných jazyků odvozených z XML v široké škále softwarových nástrojů.

XML je podmnožinou SGML .

Jazyk XML

Specifikace XML popisuje jazyk a řadu problémů týkajících se kódování a zpracování dokumentů. Materiál v této části je shrnutím popisu jazyka ve specifikaci XML upravené pro tento článek.

Anglická verze dokumentu je považována za normativní, proto jsou hlavní termíny uvedeny s jejich anglickými originály.

Překlad hlavních pojmů v zásadě navazuje na překlad Specifikace do ruštiny dostupný na internetu, s výjimkou pojmů tag a deklarace . Pro výraz tag se zde používá tag překlad . U termínu deklarace je dávána přednost běžné deklaraci překladu (oproti rovněž běžné deklaraci pauzovacího papíru ).

Další překlady hlavních termínů lze nalézt v literatuře a na internetu.

Fyzická a logická struktura dokumentu

Z fyzického hlediska se dokument skládá z entit , z nichž každá  může odkazovat na jinou entitu. Jediným kořenovým prvkem  je entita dokumentu . Obsahem entit jsou symboly.

Z logického hlediska se dokument skládá z komentářů ( anglicky  comments ), deklarací ( anglicky  deklarace ), elementů ( anglicky  elements ), odkazů na entity ( anglicky  character references ) a instrukcí pro zpracování ( anglicky  processing guidelines ). To vše v dokumentu je strukturováno pomocí značek . 

Fyzická struktura

Entita  je nejmenší část dokumentu. Všechny entity něco obsahují a všechny mají jméno (existují výjimky, např . document entity ). Jednoduše řečeno, termín „esence“ popisuje „existující věc“, „ něco “ [6] .

Dokument se skládá z entit, jejichž obsahem jsou symboly. Všechny znaky jsou rozděleny do dvou typů: datové znaky ( English  character data ) a značkovací znaky. Značky zahrnují:

  1. tagy ( angl.  tags ) <- označují hranice prvků
  2. prohlášení a pokyny pro zpracování, včetně jejich atributů ( anglické  atributy )
  3. odkazy na entity
  4. komentáře
  5. stejně jako znakové sekvence rámující sekce " CDATA " .

Neoznačenou částí dokumentu jsou znaková data dokumentu.

Logická struktura

Všechny součásti dokumentu jsou shrnuty v prologu a kořenovém prvku . Kořenový prvek  je povinnou součástí dokumentu, který tvoří celou jeho podstatu (obecně řečeno může chybět prolog). Kořenový element může nebo nemusí obsahovat své vnořené elementy, znaková data a komentáře. Prvky vnořené do kořenového prvku mohou zase zahrnovat vnořené prvky, znaková data a komentáře a tak dále. Prolog může obsahovat deklarace , pokyny pro zpracování , komentáře . Mělo by začínat deklarací XML , i když tato deklarace může být v určitých situacích vynechána.

Prvky dokumentu musí být správně vnořené : každý prvek, který začíná uvnitř jiného prvku (tj. jakýkoli prvek dokumentu jiný než kořenový prvek), musí končit uvnitř prvku, na kterém začal. Znaková data se mohou vyskytovat v prvcích buď přímo, nebo ve speciálních sekcích "CDATA" . Deklarace, instrukce pro zpracování a prvky mohou mít přiřazené atributy. Atributy se používají k přiřazení párů název-hodnota k logické jednotce textu.

Značkovací symboly

Označení vždy začíná znakem <a končí znakem >.

Spolu se symboly <a >symbol také hraje zvláštní roli ve značení &. Lomené závorky označují hranice prvků, instrukce pro zpracování a některé další sekvence. Ampersand umožňuje nahradit text pomocí entit ( anglicky  entity ) [6] .

Řešení nejednoznačnosti značení

Použití značkovacích znaků ve znakových datech ztěžuje rozpoznání značkovacích konstrukcí a může způsobit problém nejednoznačnosti struktury. V XML je tento problém vyřešen následovně: <, > a & nemohou být přítomny ve znakových datech a v hodnotách atributů v jejich přímé podobě, pro jejich reprezentaci jsou v těchto případech vyhrazeny speciální entity :

Symbol Výměna, nahrazení
< <
> >
& &

Kromě toho se k použití apostrofů a uvozovek v hodnotách atributů používají následující entity :

' 'apos;
" "

Pravidlo nahrazení značkovacích znaků jejich označujícími entitami se nevztahuje na znaková data v sekcích "CDATA", ale provádí se na všech ostatních místech v dokumentu.

Odkazy na číselné znaky

Číselné odkazy na znaky označují pozici kódu znaku ve znakové sadě dokumentu. Číselné odkazy na znaky mohou mít dvě formy [7] :

  1. syntaxe " &#D; ”, kde D je desetinné číslo;
  2. syntaxe " &#xH; " nebo " &#XH; ”, kde H je hexadecimální číslo (hexadecimální čísla v číselných symbolických odkazech nerozlišují malá a velká písmena).

Příklady odkazů na číselné znaky:

  • å  - (v desítkovém tvaru) představuje písmeno "a" s malým kroužkem nad ním (používá se např. v norštině);
  • å  - (v šestnáctkové soustavě) představuje stejný znak;
  • å  - (v šestnáctkové soustavě) také představuje stejný znak;
  • И  — (v desítkovém tvaru) představuje velké písmeno „I“ v azbuce;
  • 水  - (v šestnáctkové soustavě) představuje čínský znak pro „vodu“;

Jména

V XML musí všechna jména začínat písmenem, znakem podtržítka (_) a pokračovat pouze znaky, které jsou pro jména povoleny, konkrétně: mohou obsahovat pouze písmena, která jsou součástí části písmen Unicode, arabské číslice, pomlčky, podtržítka , tečky. Vzhledem k tomu, že písmena nejsou omezena pouze na znaky ASCII, lze v názvech použít písmena z libovolného jazyka.

Prolog

XML deklarace

XML deklarace specifikuje jazykovou verzi, ve které je dokument napsán. Vzhledem k tomu, že interpretace obsahu dokumentu závisí na verzi jazyka, specifikace předepisuje začít dokument deklarací XML. V první (1.0) verzi jazyka bylo použití prohlášení nepovinné, v dalších verzích je povinné. Z deklarace se tedy určí jazyková verze a pokud deklarace neexistuje, předpokládá se verze 1.0.

Kromě XML verze může deklarace obsahovat také informace o kódování dokumentu a „zda má dokument zůstat s vlastním DTD , nebo s jedním vloženým“.

Příklad:

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

nebo:

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

Ve všech těchto příkladech chyběl atribut „standalone“, který pouze určuje, zda se mají do dokumentu zahrnout popisy značek zvenčí. Výchozí hodnota je "ne":

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

pokud dokument XML odkazuje na jiné DTD, které popisují, co může dokument obsahovat, musíte uvéststandalone="no"

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

pokud dokument XML neodkazuje na jiné soubory a bude používat vlastní DTD, musíte zadatstandalone="yes"

Deklarace typu dokumentu

Pro deklaraci typu dokladu existuje speciální instrukce !DOCTYPE. Umožňuje vám určit pomocí jazyka DTD, které prvky jsou v dokumentu zahrnuty, jaké jsou jejich atributy, které entity lze použít a něco jiného.

Zde je například správný dokument:

<?xml version="1.0"?> <pozdrav> Dobrý den, světe! </pozdrav>

Má kořenový prvek <greeting>Hello, world!</greeting>a dokument logicky existuje. Není však platný ( eng.  not valid ) [8] .

Pomocí Deklarace typu dokumentu (DTD) je možné popsat jeho obsah a logickou strukturu a také přiřadit pár název-hodnota ke konkrétnímu prvku. Zde je návod, jak vypadá prolog v příspěvku Backus-Naur [9] :

prolog ::= XMLDecl? Různé* (doctypedecl Různé*)? XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' VersionInfo ::= S 'version' Eq ("'" VersionNum "'" | '"' VersionNum '"') Eq ::= S? '='S? VersionNum ::= '1.' [0-9]+ Různé ::= Komentář | PI | S doctypedecl ::= '<!DOCTYPE' S Jméno (S ExternalID)? S? ('[' intSubset ']' S?)? '>' DeclSep ::= PEreference | S intSubset ::= (markupdecl | DeclSep)* markupdecl ::= elementdecl | AttlistDecl | EntityDecl | Notace Decl | PI | Komentář extSubset ::= TextDecl? extSubsetDecl extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)*

Po deklaraci XML mohou následovat komentáře, pokyny pro zpracování nebo mezery [10] , ale pak následují Deklarace typu dokumentu, kde „Name“ je název kořenové značky , „ExternalID“ je externí identifikátor a „intSubset“ je deklarace označení nebo odkaz na entitu. Jak říká specifikace, je-li externí identifikátor deklarován společně s interní deklarací, pak je druhý před prvním [11] .

Například:

<?xml version="1.0"?> <!DOCTYPE pozdrav SYSTEM "hello.dtd"> <pozdrav> Ahoj světe! </pozdrav>

Zde SYSTEM "hello.dtd"je " " externí identifikátor: adresa "hello.dtd" vám umožňuje použít data v dokumentu "hello.dtd" jako deklarace značek.

<?xml version="1.0" encoding="UTF-8" ?> <!Pozdrav DOCTYPE [ <!Pozdrav ELEMENT (#PCDATA)> ]> <pozdrav> Ahoj světe! </pozdrav>

Zde byla značka deklarována lokálně v !DOCTYPE.

Návod na zpracování

Instrukce pro zpracování ( angl.  processing direction, PI ), umožňují umístit do dokumentu instrukce pro aplikace. Následující příklad ukazuje instrukci pro zpracování xml-stylesheet, která předává pokyny v souboru my-style.css aplikaci xml-stylesheet (jako je prohlížeč) prostřednictvím atributu href:

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

Komentáře ( angl.  comment ) se nevztahují na znaková data dokumentu. Komentář začíná sekvencí "<!--" a končí sekvencí "-->", kombinace znaků "--" uvnitř nemůže nastat. Znak & se nepoužívá jako označení uvnitř komentáře.

Příklad:

<!-- toto je komentář -->

Kořenový prvek

Prvek a jeho označení

Prvek je  koncept logické struktury dokumentu. Každý dokument obsahuje jeden nebo více prvků. Hranice prvků jsou reprezentovány počáteční a koncovou značkou . Název prvku v počáteční a koncové značce prvku se musí shodovat. Prvek může být také reprezentován prázdným tagem prvku , to znamená, že nezahrnuje další prvky a znaková data.

Tag ( anglicky  tag ) je značkovací konstrukt, který obsahuje název prvku.

Počáteční značka: <element1>

Koncová značka: </element1>

Značka prázdného prvku: <empty_element1 />

V prvku lze atributy použít pouze v počáteční značce a prázdné značce prvku.

Příklad receptu označeného pomocí XML:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE recept> < název receptu= "chléb" preptime= "5min" doba vaření= "180min" > <title> jednoduchý chléb </title> <composition> <množství složky = "3" unit= "sklo" > Mouka </ingredient> < množství složky= "0,25" unit= "gram" > Droždí </ingredient> < množství složky= "1,5" unit= "sklo" > Teplá voda </ingredient> </composition> <instructions> <step> Všechny ingredience smícháme a důkladně prohněteme. </step> <step> Uzavřete utěrkou a nechte jednu hodinu v teplé místnosti. </step> <!-- <step> Přečtěte si včerejší noviny. </step> je pochybný krok... --> <step> Znovu prohněteme, dáme na plech a dáme do trouby. </step> </instructions> </recipe> Sekce CDATA

Oddíl CDATA není logická jednotka textu. Sekce se může vyskytovat kdekoli v dokumentu, kde syntaxe umožňuje umístit znaková data. Sekce začíná <![CDATA[a končí ]]>. Mezi tímto označením jsou znaková data; znaková data tedy zahrnují znaky < > &v jejich bezprostřední podobě.

Správný dokument

Správně zpracovaný dokument vyhovuje všem obecným pravidlům syntaxe XML platným pro jakýkoli dokument XML :  správná struktura dokumentu, shodu názvů ve značce počátečního a koncového prvku atd. Dokument, který není ve správném formátu, nelze považovat za dokument xml.

Jmenné prostory

Příklad dokumentu:

<?xml version="1.0" encoding="UTF-8"?> <!-- přihlašovací obrazovka --> <edsscript> <název sekvence = "start" > <action cmd= "triggeron" > bt* </action> <action cmd= "triggeron" > msg_generic </action> <action cmd= "disablenbb" > Všechno </action> <action cmd= "setscrtext" > @@Systém Giris@@ </action> <action cmd= "enablenbb" > vpřed, hlavní menu </action> <action cmd= "switchmsgtarget" > LOGIN_DLG </action> <action cmd= "sendmsg" > Start </action> <action cmd= "skok" > krok 2 </action> </sequence> <sequence name= "step2" > <action cmd= "waittrigger" > btnforward </action> <action cmd= "triggeron" > přihlásit se* </action> <action cmd= "disablenbb" > Všechno </action> <action cmd= "sendmsg" > šek </action> </sequence> <trigger name= "login_succeded" > <condition type= "appmsg" > přihlášení_úspěšné </condition> <sequence> <action cmd= "endscript" /> </sequence> </trigger> <trigger name= "login_unknownuser" > <condition type= "appmsg" > login_unknownuser </condition> <název sekvence = "login_unknownuser" > <action cmd= "disablenbb" > Všechno </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" > zadní </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "skok" > Start </action> </sequence> </trigger> <trigger name= "login_incorrectpwd" > <condition type= "appmsg" > login_incorrectpwd </condition> <sequence name= "login_incorrectpwd" > <action cmd= "disablenbb" > Všechno </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" > zadní </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "skok" > Start </action> </sequence> </trigger> <!-- generic triggers --> <trigger name= "btnback" > <condition type= "buttonclick" > zadní </condition> <název sekvence = "btnback" > <action cmd= "triggeron" > btnback </action> </sequence> </trigger> <trigger name= "btnforward" > <condition type= "buttonclick" > vpřed </condition> <název sekvence = "btnforward" > <action cmd= "triggeron" > btnforward </action> </sequence> </trigger> <trigger name= "btnmainmenu" > <condition type= "buttonclick" > hlavní menu </condition> <sequence> <action cmd= "jumpscript" > <value label= "mainmenuscript" scope= "local" /> </action> </sequence> </trigger> <trigger name= "btnquitapp" > < condition type= "buttonclick" > ukončení aplikace </condition> <sequence name= "btnquitapp" > <action cmd= "callscript" > Quitapp.xml </action> <action cmd= "skok" > Start </action> </sequence> </trigger> <trigger name= "error_generic" > <condition type= "appmsg" > chyba* </condition> <sequence> <action cmd= "showhtml" > errdsc_null.htm,@@Hata@@ </action> <action cmd= "disablenbb" > Všechno </action> <action cmd= "enablenbb" > vpřed </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> <!-- Neošetřená výjimka je vyvolána ze strany pevného kódu. --> < název spouštěče= "error_hardcodeside" > < typ podmínky= "appmsg" > error_hardcodeside </condition> <sequence> <action cmd= "triggeroff" > * </action> <action cmd= "triggeron" > btnmainmenu </action> <action cmd= "triggeron" > btnquitapp </action> <action cmd= "disablenbb" > Všechno </action> <action cmd= "enablenbb" > hlavní menu </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>

Regulace práce s dokumenty: pravidla, jazyky, programovací rozhraní

Tato část obsahuje souhrn některých ustanovení doporučení W3C týkajících se práce s dokumenty. Odpovídající doporučení mohou platit jak pro XML dokumenty, tak pro širší třídu dokumentů. Obvykle jsou poskytovány odkazy na nástroje pro správu dokumentů doporučené organizací W3C.

Kódování dokumentu

Specifikace vyžaduje, aby procesory podporovaly alespoň dvě kódování Unicode: UTF-8 a UTF-16 .

XML procesor a aplikace

Specifikace XML definuje koncepty procesoru XML a aplikace . Procesor XML ( parser ) je program, který analyzuje značky a předává informace o struktuře dokumentu jinému programu, aplikaci.

Specifikace XML klade určité požadavky na procesor, aniž by ovlivňovala požadavky na aplikaci.

Platný dokument. Ověřování a neověřování procesorů

Dokument je platný , pokud má přidruženou definici typu dokumentu a pokud dokument vyhovuje omezením uvedeným v definici typu dokumentu.

Procesory XML se dělí do dvou tříd: ověřující a neověřující.

Validační zpracovatelé kontrolují platnost dokumentu a musí hlásit (dle volby uživatele) porušení omezení uvedených v definici typu dokumentu.

Nevalidující zpracovatelé nekontrolují platnost dokumentu, ale výše uvedené povinnosti předzpracování dokumentu jim zůstávají.

Popis typů dokumentů: Jazyky schémat

Jazyky schémat se používají k popisu typů dokumentů .  Protože XML je podmnožinou jazyka SGML , zdědí jazyk Document Type Definition ( DTD ) vyvinutý pro SGML. Později byly vyvinuty další jazyky schémat, nejznámější je XML Schema , RELAX NG .

Převod dokumentu XML

XSLT je navržen tak, aby vyřešil problém transformace dokumentu XML do jiného schématu nebo jiného formátu .

Formát vykreslování dokumentu

Pro formátovaný dokument (dokument připravený k vykreslení) je určen formát XSL-FO .

Dotazovací jazyky

XPath  je syntaxe pro adresování obsahu dokumentu reprezentovaného ve formě stromu. Výrazy XPath se používají v jazyce XQuery . Výrazy XPath lze obecně použít v jakémkoli kontextu, kde je vhodné použít formální odkazy na prvky stromu, zejména jako parametry metod rozhraní pro přístup k dokumentům.

XQuery  je dokumentově orientovaný programovací jazyk.

Čtení XML: Tři API

Pro čtení XML existují tři možnosti API [12] .

Event API ( event-driven API, push-style API ) - XML ​​​​procesor čte XML; při určité události (vzhled otevírací nebo uzavírací značky, textového řetězce, atributu) je volána funkce zpětného volání .

  • + Spotřebovává málo paměti [12] .
  • + Při zpracování velkého XML existuje standardní bod, který vám umožní okamžitě zastavit handler [12] .
  • - Pro aplikačního programátora je to nesmírně obtížné: musíte si v paměti uchovávat informace, na kterém místě dokumentu se nacházíme.
  • + Knihovna se snadno programuje.
  • − Pouze sekvenční přístup k XML [13] , to ztěžuje analýzu křížových odkazů a „téměř správné“ XML se smíšeným pořadím prvků.
  • − API pouze pro čtení, zápis bude vyžadovat jiné API [14] .
  • ± Přirozená volba, když je z velkého XML potřeba extrahovat málo dat [12] .
  • ± Přirozená volba, když je třeba XML převést na doménovou strukturu [12] .
  • Příklady knihoven: SAX , Expat
Všech pět příkladů pracuje s tímto XML <?xml version="1.0" encoding="UTF-8" ?> <document> <thing name= "A" > Alpha </thing> <thing name= "B" > Bravo </thing> </document> Příklad kódu (C++, fiktivní API) enum class Místo { ROOT , DOCUMENT , THING , N } Place parentPlace [ static_cast < int > ( Place :: N )] = { ROOT , ROOT , DOCUMENT }; class MyEvent : public Xml :: Událost { soukromý : Místo místo = Místo :: KOŘEN ; Věc * currThing = nullptr ; veřejnost : /// @return true — značka je potřeba; false - přeskočte a vše uvnitř bool onTagOpen ( const std :: string & aName ) override ; void onTagClose () override ; void onAttr ( const std :: string & aName , const std :: string & a aValue ) override ; void onText ( const std :: string & aText ) override ; } bool MyEvent :: onTagOpen ( const std :: string & aName ) { přepínač ( místo ) { Místo pouzdra :: ROOT : if ( aName == "dokument" ) { místo = Místo :: DOKUMENT ; vrátit true ; } zlomit ; místo případu :: DOKUMENT : if ( aName == "věc" ) { místo = Místo :: VĚC ; currThing = & věci . emplace_back (); vrátit true ; } zlomit ; } vrátit false ; } void MyEvent :: onTagClose () { místo = rodičMísto [ místo ]; } void MyEvent :: onAttr ( const std :: string & aName , const std :: string & aValue ) { if ( place == Place :: THING && aName == "name" ) currThing -> name = aValue ; } void MyEvent :: onText ( const std :: string & aText ) { if ( místo == Místo :: VĚC ) currThing -> hodnota = aText ; } xml :: eventDrivenRead ( "in.xml" , MyEvent ());

Stream API (také pull-style API ) - uspořádáno na způsob I/O streamů . Aplikační kód žádá procesor o části XML, který se může přes XML pohybovat pouze vpřed a zapomenout na části, které již prošly.

  • + Spotřebovává málo paměti.
  • + Informace, na kterém místě dokumentu se nacházíme, je implicitně nastavena místem ve vláknu provádění . To značně zjednodušuje práci aplikačního programátora [15] [14] . Na dobře promyšlených rozhraních API se množství kódu blíží množství kódu DOM.
  • − Knihovna se obtížně programuje.
  • + Umožňuje současný přístup ke dvěma dokumentům XML [15] .
  • − Pouze sekvenční přístup k XML [14] , to ztěžuje analýzu křížových odkazů a „téměř správné“ XML se smíšeným pořadím prvků.
  • − API pouze pro čtení, zápis bude vyžadovat jiné API. ( StAX , i když je také streamovací, má samostatné API pro přímý zápis [16] .)
  • Příklady knihoven: StAX
Příklad kódu (C++, fiktivní API) xml :: čtečka StreamReader ( "in.xml" ); std :: název řetězce , hodnota ; čtenář . enterTag ( "dokument" ); while ( čtenář . getTag ( "věc" ) { Věc věc ; věc . jméno = čtenář . requireStringAttr ( "jméno" ); čtenář . enterTag (); věc . hodnota = čtenář . getText (); čtenář . LeaveTag (); věci . emplace_back ( std :: pohyb ( věc )); }

Object API ( Document Object Model , DOM, "model objektu dokumentu") - čte XML a znovu jej vytváří v paměti jako objektovou strukturu.

  • - Využívá hodně paměti - mnohem více, než samotné XML zabírá na disku. Na pugixml je spotřeba paměti třikrát nebo vícekrát delší než délka XML.
  • + Snadné pro programátora aplikací.
  • + Knihovna se snadno programuje.
  • + Umožňuje náhodný přístup k XML [12] . To například zjednodušuje práci s křížovými odkazy. Často je možné rozpoznat „téměř správné“ XML se zmateným pořadím značek.
  • + Společné API pro čtení a zápis [14] .
  • ± Přirozená volba, když je objektem domény samotné XML: ve webovém prohlížeči [12] , editor XML, v importéru do lokalizačního programu , který extrahuje řetězce z XML libovolné struktury.
  • ± Přirozená volba, když chcete načíst XML, mírně přepracovat a uložit [12] [14] . Ty části, kterých se není třeba dotýkat, nevyžadují žádný kód.
  • Příklady knihoven: JDOM , TinyXML , pugixml
Příklad kódu (C++, pugixml ) #include <iostream> #include <vektor> #include "pugixml.hpp" struct Thing { std :: název řetězce , hodnota ; }; // Pokud je nějaká entita pugixml převedena na bool jako false, vyvolá chybu! šablona < classT > _ inline T need ( T && val , const char * errmsg ) { if ( ! val ) throw std :: logic_error ( errmsg ); return std :: forward < T > ( val ); } int main () { std :: vector < Thing > things ; pugi :: xml_document doc ; need ( doc . load_file ( "in.xml" ), "Nelze načíst XML!" ); auto elDocument = potřeba ( doc . root (). child ( "document" ), "Need <document>" ); for ( pugi :: xml_node elThing : elDocument . children ( "věc" ) )) { auto attrName = need ( elThing . atribut ( "name" ), "Need <thing>.name!" ); věci . emplace_back ( Thing { attrName . as_string (), elThing . text (). as_string () } ); } for ( auto & v : things ) { std :: cout << v . jméno << "=" << v . hodnota << std :: endl ; } návrat 0 ; }

Existují také hybridní API: externí a nedůležité části jsou čteny metodou stream, zatímco vnitřní a důležité části jsou čteny metodou objektu.

Příklad kódu (C++, fiktivní API) xml :: čtečka StreamReader ( "in.xml" ); std :: název řetězce , hodnota ; čtenář . enterTag ( "dokument" ); while ( čtenář . getTag ( "věc" ) { xml :: Element * elThing = čtečka . readEntireSubtree (); věci . emplace_back (); Věc & věc = věci . zpět (); věc . jméno = elThing . requireStringAttr ( "jméno" ); věc . hodnota = elVěc . text (); }

Zápis XML: dvě možnosti API

Direct Write API zapisuje XML tag po tagu, atribut po atributu.

  • + Rychlé, žádné mezilehlé objekty.
  • − Primitivní knihovna může vykreslit suboptimální XML (např . <tag></tag>místo <tag />). Optimální práce je mnohem obtížnější naprogramovat.
  • − Nevhodné pro určité specifické úkoly.
  • − Pokud struktury předmětové oblasti fungují nespolehlivě, bez zvláštních opatření (zápis do paměti nebo do jiného souboru, poté přejmenování), můžete skončit s „padlým“ programem a ztraceným souborem.
  • − Chyba programátora může vést k syntakticky nesprávnému XML.
  • - API pouze pro zápis, čtení bude vyžadovat jiné API.
  • Příklady knihoven: StAX .
Příklad kódu (C++, fiktivní API) xml :: Writer wri ( "out.xml" ); wri . openTag ( "dokument" ); for ( auto & v : things ) { wri . openTag ( "věc" ); wri . writeAttr ( "jméno" , v . jméno ); wri . writeText ( v . hodnota ); wri . closeTag ( "věc" ); } wri . closeTag ( "dokument" );

Object API aka Document Object Model .

  • − Vytvoří strukturu objektu pro XML, která může zabírat více paměti než struktura domény.
  • ± Univerzální (ve většině úloh však není žádná výhoda oproti dobře vyvinutému API přímého zápisu – na rozdíl od čtení).
  • + I když struktury domény fungují nespolehlivě a programátor nezajistil žádnou „ochranu“, jediným scénářem, kdy je soubor přepsán neúplným, je chyba I/O (zejména nedostatek místa na disku).
  • + S dobře napsaným API je nemožné vytvořit syntakticky nesprávné XML.
  • + Společné API pro zápis a čtení.
  • Příklady knihoven: stejné jako pro čtení XML metodou DOM.
Příklad kódu (C++, pugixml ) #include "pugixml.hpp" struct Věc { std :: název řetězce , hodnota ; }; Věci věci [] { { "A" , "Alpha" , }, { "B" , "Bravo" , }, { "C" , "Charlie" } }; int main () { pugi :: xml_document doc ; auto root = doc . append_child ( "dokument" ); pro ( auto a věc : věci ) { autonode = root . _ append_child ( "věc" ); uzel . append_attribute ( "jméno" ) = věc . jméno . c_str (); uzel . append_child ( pugi :: node_pcdata ). set_value ( věc . hodnota . c_str ()); } doc . save_file ( "test.xml" ); návrat 0 ; }

Nástroje pro dokumenty: parsery, nástroje pro tvorbu a vizualizaci, databázové systémy

Implementace analyzátoru

XML má implementace parseru pro všechny moderní programovací jazyky ​​[17] .

Webové prohlížeče jako nástroj pro vykreslování dokumentů

Vykreslování bez použití stylů CSS

Bez použití CSS nebo XSL je dokument XML ve většině webových prohlížečů vykreslen jako prostý text. Některé prohlížeče, jako je Internet Explorer , Mozilla Firefox a Opera (v Opeře zabudovaný nástroj Dragonfly ), zobrazují strukturu dokumentu jako strom, což umožňuje sbalení a rozbalení uzlů pomocí kliknutí myší.

Použití stylů CSS

Proces je podobný použití CSS na HTML dokument pro zobrazení. Chcete-li použít CSS při zobrazení v prohlížeči, musí dokument XML obsahovat speciální odkaz na šablonu stylů. Například:

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

To se liší od přístupu HTML, který používá prvek <link>.

Použití transformací na formát XSL-FO

Moderní prohlížeče patří mezi nástroje, které umí provádět transformace XSLT. V prohlížeči se taková transformace obvykle provádí pro formátování dokumentu (převod dokumentu do formátu XSL-FO). Následující příkaz v prologu dokumentu XML dává prohlížeči pokyn, aby provedl transformaci XSLT popsanou v souboru transform.xsl:

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

XML editory

S dokumentem XML můžete pracovat v běžném textovém editoru, ale běžné editory nepodporují strukturu dokumentu. Existují speciální XML editory , díky kterým je práce s dokumentem pohodlnější a efektivnější.

Systémy pro správu databází, které pracují s daty ve formátu XML

Systém správy databází DB2 umožňuje ukládat data ve formátu XML a poskytuje přístup k těmto datům pomocí jazyka XQuery.

Hardwarová podpora

XML je podporováno na nízké úrovni hardwaru, firmwaru a softwaru v moderních hardwarových řešeních [18] .

Rozsah, omezení, vyhlídky rozvoje

Efektivita použití XML

XML je značkovací jazyk, jinými slovy prostředek k popisu dokumentu. Je to ve výklenku dokumentů, textů, kde je podíl dat heterogenních znaků velký a podíl značek je malý - XML ​​​​je úspěšné. Na druhou stranu výměna dat v otevřených systémech není omezena na výměnu dokumentů. Redundance značek XML (a pro účely návrhu jazyka je výslovně uvedeno, že stručnost není prioritou projektu) ovlivňuje situace, kdy data nezapadají do tradičního modelu dokumentu. News feed, například formátovaný pomocí syntaxe XML ( RSS , formáty Atom ), není dokumentem v tradičním slova smyslu, ale proudem stejného typu minidokumentů – podrobný a redundantní kód je v tomto případě nezbytnou součástí. přenášených dat.

W3C se obává účinnosti XML a příslušné pracovní skupiny se touto otázkou zabývají (od začátku roku 2013 nebyly vypracovány žádné normativní dokumenty).

Další situace, kdy formáty XML nemusí být nejlepším řešením, je při práci s daty s jednoduchou strukturou a malým množstvím znakových dat (datových polí). V tomto případě je podíl značek na celkovém objemu velký a programové zpracování XML může být ve srovnání s prací s daty jednodušší struktury nepřiměřeně drahé. V této oblasti se vývojáři zaměřují na nativní nástroje orientované na data, jako jsou INI , YAML , JSON .

Skriptovací jazyk pro práci s XML

W3C pracuje na vytvoření skriptovacího jazyka pro práci s XML (do začátku roku 2013 nebyly vypracovány žádné regulační dokumenty).

Viz také

  • XML-RPC
  • Schéma XML
  • SOAP ( Simple Object Access Protocol ) je protokol pro přenos dat, který pro zprávy používá formát XML . 
  • ODPOČINEK
  • XHTML  je verze HTML , která odpovídá syntaktickým požadavkům XML.
  • XSD  je jazyk pro popis struktury XML dokumentů.
  • FB2  - formát popisu knihy založený na XML
  • W3C DOM
  • DITA
  • WDDX
  • APML

Poznámky

  1. Typy médií XML, RFC 3023 9–11. IETF (leden 2001). Získáno 4. ledna 2010. Archivováno z originálu 22. srpna 2011.
  2. Typy médií XML, RFC 3023 7–9. IETF (leden 2001). Získáno 4. ledna 2010. Archivováno z originálu 22. srpna 2011.
  3. M. Murata, D. Kohn a C. Lilley. Internetové koncepty: Typy médií XML . IETF (24. září 2009). Získáno 10. června 2010. Archivováno z originálu 22. srpna 2011.
  4. Extensible Markup Language (XML) 1.0 (páté vydání) . Získáno 6. července 2011. Archivováno z originálu 1. dubna 2009.
  5. Extensible Markup Language (XML) 1.1 (druhé vydání) . Získáno 6. července 2011. Archivováno z originálu dne 3. července 2011.
  6. 1 2 Vysvětlení slova "entita" ve specifikaci jazyka XML. . Získáno 12. dubna 2014. Archivováno z originálu 10. ledna 2020.
  7. Reprezentace dokumentu HTML . www.w3.org. Získáno 27. listopadu 2019. Archivováno z originálu dne 23. prosince 2019.
  8. Vysvětlení slova „platný“ ve specifikaci. . Získáno 12. dubna 2014. Archivováno z originálu 10. ledna 2020.
  9. Použití formuláře Backus-Naura ve specifikaci. . Získáno 12. dubna 2014. Archivováno z originálu 10. ledna 2020.
  10. Zápis prázdného místa ve tvaru Backus - Naur. . Získáno 12. dubna 2014. Archivováno z originálu 10. ledna 2020.
  11. Pokud je použita jak externí, tak interní podmnožina, MUSÍ být považována za vnitřní podmnožinu, která se vyskytuje před externí podmnožinou.
  12. 1 2 3 4 5 6 7 8 Xml analýza . Získáno 30. srpna 2019. Archivováno z originálu dne 16. března 2022.
  13. Streamování versus DOM (Výukový program Java EE 5) . Získáno 9. dubna 2022. Archivováno z originálu 9. dubna 2022.
  14. 1 2 3 4 5 Porovnání StAX s jinými JAXP API (Výukový program Java EE 5) . Získáno 9. dubna 2022. Archivováno z originálu 9. dubna 2022.
  15. 1 2 Pull Parsing versus Push Parsing (Výukový program Java EE 5) . Získáno 9. dubna 2022. Archivováno z originálu 9. dubna 2022.
  16. StAX API (Výukové programy Java™ > Java API pro zpracování XML (JAXP) > Streaming API pro XML) . Získáno 9. dubna 2022. Archivováno z originálu 9. dubna 2022.
  17. XML Parsers (downlink) . Získáno 11. března 2009. Archivováno z originálu 3. března 2009. 
  18. Intel XML Accelerator  (downlink)

Literatura

  • David Hunter, Jeff Rafter, Joe Faucette, Eric van der Vlist a další XML. Práce s XML, 4. vydání = Beginning XML, 4. vydání. - M. : "Dialektika" , 2009. - 1344 s. — ISBN 978-5-8459-1533-7 .
  • David Hunter, Jeff Rafter a kol., XML. Základní kurz = Začátek XML. — M. : Williams , 2009. — 1344 s. — ISBN 978-5-8459-1533-7 .
  • Robert Tábor. Implementace webových služeb Microsoft .NET XML = Webové služby Microsoft .NET XML. - M .: Williams , 2002. - 464 s. - ISBN 0-672-32088-6 .

Odkazy