XML

Kokeneet kirjoittajat eivät ole vielä tarkistaneet sivun nykyistä versiota, ja se voi poiketa merkittävästi 3.6.2022 tarkistetusta versiosta . tarkastukset vaativat 3 muokkausta .
XML ( englanniksi  eXtensible Markup Language ) laajennettava merkintäkieli
Laajennus .xml
MIME -tyyppinen application/xml [1] , text/xml [2] (poistettu käytöstä vanhentuneessa luonnoksessa) [3]
Kehittäjä World Wide Web Consortium
julkaistu 1998
Muototyyppi merkintäkieli
Laajennettu kohteesta SGML
Kehitetty vuonna XHTML , RSS , Atom , KML , SVG ja monet muut tiedostomuodot
Standardit) 1.0 (viides painos), 26. marraskuuta 2008 [4]
1.1 (toinen painos), 16. elokuuta 2006 [5]
avoin muoto ? Joo
Verkkosivusto w3.org/XML
 Mediatiedostot Wikimedia Commonsissa

XML ( MFA : [ ˌ e k s . e m ˈ e l ], lyhenne englannista .  e X tensible Markup L Anguage ) - "laajennettava merkintäkieli ". Suosittelee World Wide Web Consortium (W3C). XML-spesifikaatio kuvaa XML-dokumentteja ja kuvaa osittain XML-prosessorien käyttäytymistä (ohjelmat, jotka lukevat XML-dokumentteja ja tarjoavat pääsyn niiden sisältöön). XML on suunniteltu kieleksi, jolla on yksinkertainen muodollinen syntaksi, helppo luoda ja käsitellä asiakirjoja sekä ohjelmille että ihmisille , painottaen käyttöä Internetissä. Kieltä kutsutaan laajennettavaksi, koska se ei korjaa dokumenteissa käytettyjä merkintöjä: kehittäjä voi vapaasti luoda merkintöjä tietyn alueen tarpeiden mukaan, ja sitä rajoittavat vain kielen syntaksisäännöt. XML-laajennus  on konkreettinen XML-pohjainen kielioppi , jota edustaa tunnisteiden ja niiden attribuuttien sanakirja sekä joukko sääntöjä, jotka määrittelevät, mitkä attribuutit ja elementit voivat sisältyä muihin elementteihin. Yksinkertaisen muodollisen syntaksin, ihmisystävällisyyden, laajennettavuuden ja luottamuksen Unicode -koodauksiin asiakirjojen sisällön esittämisessä yhdistelmä on johtanut sekä XML:n itsensä että useiden XML-pohjaisten erikoiskielien laajaan käyttöön useissa eri kielissä. ohjelmistotyökalut.

XML on SGML :n osajoukko .

XML-kieli

XML-spesifikaatiossa kuvataan kieli ja useita asiakirjojen koodaukseen ja käsittelyyn liittyviä kysymyksiä. Tämän osion materiaali on tiivistelmä XML-määrityksen kielikuvauksesta, joka on mukautettu tätä artikkelia varten.

Asiakirjan englanninkielistä versiota pidetään normatiivisena, joten päätermit on annettu englanninkielisten alkuperäisten kanssa.

Päätermien käännös noudattaa pohjimmiltaan Internetissä saatavilla olevaa Specificationin venäjänkielistä käännöstä termejä tag ja deklaraatio lukuun ottamatta . Termitunnisteelle käytetään käännöstunnistetta tässä . Ilmaisulla ilmoitus on etusijalla yhteinen käännösilmoitus ( verrattuna myös yleiseen merkintäpaperiilmoitusta ).

Muita päätermien käännöksiä löytyy kirjallisuudesta ja Internetistä.

Asiakirjan fyysinen ja looginen rakenne

Fyysisesti katsottuna asiakirja koostuu kokonaisuuksista , joista jokainen  voi viitata toiseen kokonaisuuteen. Yksittäinen juurielementti  on asiakirjakokonaisuus . Entiteettien sisältö on symboleja.

Loogisesti katsottuna dokumentti koostuu kommenteista ( englanninkieliset  kommentit ), ilmoitukset ( englanninkieliset  deklaraatiot ), elementit ( englanninkieliset  elementit ), entiteettiviittaukset ( englanninkieliset merkkiviitteet ) ja käsittelyohjeet ( englanninkieliset käsittelyohjeet ). Kaikki tämä asiakirjassa on jäsennelty merkinnöillä .   

Fyysinen rakenne

Entiteetti  on asiakirjan pienin osa. Kaikki entiteetit sisältävät jotain, ja niillä kaikilla on nimi (poikkeuksiakin on, esim . asiakirjaentiteetti ). Yksinkertaisesti sanottuna termi "olemus" kuvaa "olemassa olevaa asiaa", " jotain " [6] .

Dokumentti koostuu kokonaisuuksista, joiden sisältö on symboleja. Kaikki merkit on jaettu kahteen tyyppiin: datamerkit ( englanninkieliset  merkkitiedot ) ja merkintämerkit. Merkintä sisältää:

  1. tagit ( eng.  tags ) <- osoittavat elementtien rajoja
  2. ilmoitukset ja käsittelyohjeet, mukaan lukien niiden attribuutit ( englanninkieliset  attribuutit )
  3. entiteettiviittauksia
  4. kommentteja
  5. sekä merkkijonoja, jotka kehystävät " CDATA " -osioita

Asiakirjan ei-merkintäosa on asiakirjan merkkidata.

Looginen rakenne

Kaikki asiakirjan osat on tiivistetty prologissa ja juurielementissä . Juurielementti  on pakollinen osa dokumenttia, joka muodostaa sen koko olemuksen (yleensä prologi saattaa puuttua). Juurielementti voi sisältää tai ei sisällä sisäkkäisiä elementtejä, merkkitietoja ja kommentteja. Juurielementtiin sisäkkäiset elementit voivat puolestaan ​​sisältää sisäkkäisiä elementtejä, merkkitietoja ja kommentteja ja niin edelleen. Prolog voi sisältää ilmoituksia , käsittelyohjeita , kommentteja . Sen pitäisi alkaa XML-ilmoituksella , vaikka tämä ilmoitus voidaan jättää pois tietyissä tilanteissa.

Asiakirjaelementtien on oltava oikein sisäkkäin : jokaisen elementin, joka alkaa toisen elementin sisällä (eli minkä tahansa muun dokumentin elementin kuin juurielementin) on päätyttävä sen elementin sisään, josta se alkoi. Merkkitietoja voi esiintyä elementtien sisällä joko suoraan tai erityisissä "CDATA"-osissa . Ilmoituksiin, käsittelyohjeisiin ja elementteihin voi liittyä attribuutteja. Attribuutteja käytetään yhdistämään nimi-arvo -parit loogiseen tekstiyksikköön.

Merkintäsymbolit

Merkintä alkaa aina merkillä <ja päättyy merkkiin >.

Symbolien <ja >ohella symbolilla on myös erityinen rooli merkinnöissä &. Kulmasulut merkitsevät elementtien, käsittelyohjeiden ja joidenkin muiden sekvenssien rajat. Et-merkin avulla voit korvata tekstiä entiteeteillä ( englanninkieliset  entities ) [6] .

Merkintöjen epäselvyyden käsitteleminen

Merkintämerkkien käyttö merkkitiedoissa vaikeuttaa merkintärakenteiden tunnistamista ja voi aiheuttaa rakenteen moniselitteisyysongelman. XML:ssä tämä ongelma ratkaistaan ​​seuraavasti: <, > ja & eivät voi olla läsnä merkkitiedoissa ja attribuuttiarvoissa suorassa muodossaan, erityiset entiteetit on varattu niiden esittämiseen näissä tapauksissa :

Symboli Korvaus
< <
> >
& &

Lisäksi seuraavia entiteettejä käytetään heittomerkkien ja lainausmerkkien käyttämiseen attribuuttiarvoissa :

' '
" "

Sääntö merkintämerkkien korvaamisesta niiden merkitsevillä entiteeteillä ei koske merkkitietoja "CDATA"-osioissa, vaan se suoritetaan kaikissa muissa dokumentin paikoissa.

Numeeriset merkkiviittaukset

Numeeriset merkkiviitteet osoittavat merkin koodipaikan dokumentin merkistössä. Numeeriset merkkiviittaukset voivat olla kahdessa muodossa [7] :

  1. syntaksi " &#D; ”, jossa D on desimaaliluku;
  2. syntaksi " &#xH; " tai " &#XH; ”, jossa H on heksadesimaaliluku (heksadesimaaliluvut numeerisissa symbolisissa viitteissä eivät erota kirjainkoosta).

Esimerkkejä numeerisista merkkiviittauksista:

  • å  - (desimaalimuodossa) edustaa kirjainta "a", jonka yläpuolella on pieni ympyrä (käytetään esimerkiksi norjaksi);
  • å  - (heksadesimaalimuodossa) edustaa samaa merkkiä;
  • å  - (heksadesimaalimuodossa) edustaa myös samaa merkkiä;
  • И  — (desimaalimuodossa) edustaa kyrillistä isoa kirjainta "I";
  • 水  - (heksadesimaalimuodossa) edustaa kiinalaista merkkiä "vedelle";

Nimet

XML:ssä kaikkien nimien tulee alkaa kirjaimella, alaviivalla (_) ja jatkua vain nimissä sallituilla merkeillä, nimittäin: ne voivat sisältää vain kirjaimia, jotka ovat osa Unicode-kirjainosiota, arabialaisia ​​numeroita, tavuviivoja, alaviivoja , pisteet. Koska kirjaimet eivät rajoitu vain ASCII-merkkeihin, nimissä voidaan käyttää minkä tahansa kielen kirjaimia.

Prologi

XML-ilmoitus

XML-ilmoitus määrittää kieliversion, jolla asiakirja on kirjoitettu. Koska dokumentin sisällön tulkinta riippuu kielen versiosta, spesifikaatio määrää dokumentin aloittamisen XML-ilmoituksella. Kielen ensimmäisessä (1.0) versiossa ilmoituksen käyttö oli vapaaehtoista, myöhemmissä versioissa pakollinen. Siten kieliversio määräytyy ilmoituksesta, ja jos ilmoitusta ei ole, oletetaan versiota 1.0.

XML-version lisäksi ilmoitus voi sisältää myös tietoa dokumentin koodauksesta ja siitä, "tuleeko dokumentin säilyä omalla DTD :llä vai sellaisen kanssa".

Esimerkki:

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

tai:

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

Kaikissa näissä esimerkeissä "erillinen"-attribuutti puuttui, mikä vain määrittää, sisällytetäänkö merkintöjen kuvaukset asiakirjaan ulkopuolelta. Se on oletuksena "ei":

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

Jos XML-dokumentti viittaa muihin DTD-tiedostoihin, jotka kuvaavat, mitä asiakirja voi sisältää, sinun on määritettävästandalone="no"

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

Jos XML-dokumentti ei viittaa muihin tiedostoihin ja käyttää omaa DTD:ään, sinun on määritettävästandalone="yes"

Asiakirjatyyppiilmoitus

Asiakirjatyypin ilmoittamiseen on erityinen ohje !DOCTYPE. Sen avulla voit määrittää DTD-kielellä, mitkä elementit sisältyvät asiakirjaan, mitkä ovat niiden attribuutit, mitä entiteettiä voidaan käyttää ja jotain muuta.

Tässä on esimerkiksi oikea asiakirja:

<?xml version="1.0"?> <tervehdys> Hei maailma! </tervehdys>

Sillä on juurielementti <greeting>Hello, world!</greeting>ja loogisesti asiakirja on olemassa. Se ei kuitenkaan ole kelvollinen ( eng.  not valid ) [8] .

Document Type Declaration (DTD) -ilmoituksen avulla on mahdollista kuvata sen sisältöä ja loogista rakennetta sekä liittää nimi-arvo-pari tiettyyn elementtiin. Tältä prologi näyttää Backus-Naur-merkinnässä [9] :

prolog ::= XMLDecl? Muut* (doctypedecl Misc*)? XMLDecl ::= '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' VersionInfo ::= S 'versio' Eq ("'" VersionNum "'" | '"' VersionNum '"') Eq ::= S? '='S? VersionNum ::= '1.' [0-9]+ Muut ::= Kommentoi | PI | S doctypedecl ::= '<!DOCTYPE' S nimi (S ulkoinen ID)? S? ('[' intSubset ']' S?)? '>' DeclSep ::= PEReference | S intSubset ::= (markupdecl | DeclSep)* markupdecl ::= elementdecl | AttlistDecl | EntityDecl | Merkintä Decl | PI | Kommentti extSubset ::= TextDecl? extSubsetDecl extSubsetDecl ::= ( markupdecl | conditionalSect | DeclSep)*

XML-ilmoitusta voidaan seurata kommenteilla, käsittelyohjeilla tai tyhjillä välilyönneillä [10] , mutta sitten tulee asiakirjatyypin ilmoitukset, joissa "Name" on juuritunnisteen nimi , "ExternalID" on ulkoinen tunniste ja "intSubset". on merkintäilmoitus tai muuten entiteetin viite. Kuten spesifikaatio sanoo, jos ulkoinen tunniste on ilmoitettu yhdessä sisäisen ilmoituksen kanssa, niin jälkimmäinen tulee ennen ensimmäistä [11] .

Esimerkiksi:

<?xml version="1.0"?> <!DOCTYPE tervehdys SYSTEM "hello.dtd"> <tervehdys> Hei maailma! </tervehdys>

Tässä " SYSTEM "hello.dtd"" on ulkoinen tunniste: osoite "hello.dtd" antaa sinun käyttää asiakirjan "hello.dtd" tietoja merkintäilmoituksina.

<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE tervehdys [ <!ELEMENT tervehdys (#PCDATA)> ]> <tervehdys> Hei maailma! </tervehdys>

Tässä merkintä ilmoitettiin paikallisesti !DOCTYPE.

Käsittelyohje

Käsittelyohjeet ( eng.  processing instruction, PI ) mahdollistavat ohjeiden sijoittamisen dokumenttiin sovelluksille. Seuraava esimerkki näyttää xml-stylesheet-käsittelyohjeen, joka välittää my-style.css-tiedoston ohjeet xml-tyylitaulukkosovellukselle (kuten selaimelle) href-attribuutin kautta:

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

Kommentit ( eng.  comment ) eivät viittaa dokumentin merkkitietoihin. Kommentti alkaa sekvenssillä "<!--" ja päättyy sekvenssiin "-->", sisällä ei voi esiintyä merkkiyhdistelmää "--". &-merkkiä ei käytetä merkintänä kommentin sisällä.

Esimerkki:

<!-- tämä on kommentti -->

Juurielementti

Elementti ja sen merkintä

Elementti on  käsite asiakirjan loogisesta rakenteesta . Jokainen asiakirja sisältää yhden tai useamman elementin. Elementtien rajat esitetään aloitus- ja lopputunnisteilla . Elementin alku- ja lopputunnisteiden elementin nimen on oltava sama. Elementti voidaan esittää myös tyhjällä elementtitunnisteella , eli se ei sisällä muita elementtejä ja merkkitietoja.

Tag ( englanniksi  tag ) on ​​merkintärakenne, joka sisältää elementin nimen.

Aloitustunniste: <elementti1>

Lopputunniste: </element1>

Tyhjä elementtitunniste: <empty_element1 />

Elementissä attribuutteja voidaan käyttää vain aloitustagissa ja tyhjässä elementtitagissa.

Esimerkki reseptistä, joka on merkitty XML:llä:

<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE-resepti> <reseptin nimi= "leipä" preptime= "5min" cooktime = "180min " > <title> yksinkertainen leipä </title> <koostumus> <ainesosan määrä= "3" yksikkö= "lasi" > Jauhot </ingredient> <ainesosan määrä= "0,25" yksikkö= "grammaa" > Hiiva </ingredient> <ainesosan määrä= "1,5" unit= "glass" > Lämmin vesi </ingredient> </composition> <ohjeet> <step> Sekoita kaikki ainekset ja vaivaa huolellisesti. </step> <step> Sulje liinalla ja anna seistä tunnin ajan lämpimässä huoneessa. </step> <!-- <step> Lue eilinen sanomalehti. </step> on kyseenalainen askel... --> <step> Vaivaa uudelleen, laita uunipellille ja laita uuniin. </step> </instructions> </recipe> CDATA-osio

CDATA -osio ei ole looginen tekstiyksikkö. Osio voi esiintyä missä tahansa asiakirjassa, johon syntaksi sallii merkkitietojen sijoittamisen. Osio alkaa <![CDATA[ja päättyy ]]>. Tämän merkinnän välissä on merkkidataa; merkkidata sisältää siis merkit < > &niiden välittömässä muodossa.

Oikea asiakirja

Hyvin muotoiltu dokumentti noudattaa kaikkia yleisiä XML-syntaksisääntöjä, joita sovelletaan mihin tahansa XML-dokumenttiin :  oikea dokumentin rakenne, vastaavat nimet alku- ja loppuelementtitunnisteessa jne. Asiakirjaa, joka ei ole hyvin muotoiltu, ei voida pitää asiakirjan xml-tiedostona.

Nimiavaruudet

Esimerkki asiakirjasta:

<?xml version="1.0" encoding="UTF-8"?> <!-- kirjautumisnäyttö --> <edsscript> <sekvenssin nimi= "aloitus" > <action cmd= "triggeron" > bt* </action> <action cmd= "laukaisu" > msg_generic </action> <action cmd= "disablenbb" > kaikki </action> <action cmd= "setscrtext" > @@System Giris@@ </action> <action cmd= "enablenbb" > eteenpäin, päävalikko </action> <action cmd= "switchmsgtarget" > LOGIN_DLG </action> <action cmd= "sendmsg" > alkaa </action> <action cmd= "hyppää" > vaihe 2 </action> </sequence> <sequence name= "step2" > <action cmd= "waittrigger" > btn eteenpäin </action> <action cmd= "laukaisu" > Kirjaudu sisään* </action> <action cmd= "disablenbb" > kaikki </action> <action cmd= "sendmsg" > tarkistaa </action> </sequence> <trigger name= "login_suckeded" > <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" > kaikki </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" > takaisin </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "hyppää" > alkaa </action> </sequence> </trigger> <trigger name= "login_incorrectpwd" > <condition type= "appmsg" > login_incorrectpwd </condition> <sequence name= "login_incorrectpwd" > <action cmd= "disablenbb" > kaikki </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" > takaisin </action> <action cmd= "waittrigger" > btnback </action> <action cmd= "hyppää" > alkaa </action> </sequence> </trigger> <!-- yleiset triggerit --> <trigger name= "btnback" > <condition type= "buttonclick" > takaisin </condition> <sequence name= "btnback" > <action cmd= "triggeron" > btnback </action> </sequence> </trigger> <trigger name= "btnforward" > <condition type= "buttonclick" > eteenpäin </condition> <sequence name= "btnforward" > <action cmd= "triggeron" > btn eteenpäin </action> </sequence> </trigger> <trigger name= "btnmainmenu" > <condition type= "buttonclick" > päävalikko </condition> <sequence> <action cmd= "jumpscript" > <value label= " mainmenuscript" range = "local" /> </action> </sequence> </trigger> <trigger name= "btnquitapp" > < condition type= "buttonclick" > lopeta sovellus </condition> <sequence name= "btnquitapp" > <action cmd= "callscript" > quitapp.xml </action> <action cmd= "hyppää" > alkaa </action> </sequence> </trigger> <trigger name= "error_generic" > <condition type= "appmsg" > virhe* </condition> <sequence> <action cmd= "showhtml" > errdsc_null.htm,@@Hata@@ </action> <action cmd= "disablenbb" > kaikki </action> <action cmd= "enablenbb" > eteenpäin </action> <action cmd= "waittrigger" > btn eteenpäin </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= "laukaisu" > msg_generic </action> </sequence> </trigger> <!-- Kovan koodin puolelta heitetään käsittelemätön poikkeus. --> <triggerin nimi= "error_hardcodeside" > <condition type= "appmsg" > error_hardcodeside </condition> <sequence> <action cmd= "triggeroff" > * </action> <action cmd= "laukaisu" > btnmainmenu </action> <action cmd= "laukaisu" > btnquitapp </action> <action cmd= "disablenbb" > kaikki </action> <action cmd= "enablenbb" > päävalikko </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>

Asiakirjojen kanssa työskentelyn säätely: säännöt, kielet, ohjelmointirajapinnat

Tämä osio sisältää yhteenvedon joistakin W3C:n suosituksista, jotka liittyvät asiakirjojen käsittelyyn. Vastaavat suositukset voivat koskea sekä XML-dokumentteja että laajempaa dokumenttiluokkaa. Linkkejä tarjotaan yleensä W3C:n suosittelemiin dokumentinhallintatyökaluihin.

Asiakirjan koodaus

Erittely edellyttää, että prosessorit tukevat vähintään kahta Unicode-koodausta: UTF-8 ja UTF-16 .

XML-prosessori ja sovellus

XML - määrittelyssä määritellään XML - prosessorin ja sovelluksen käsitteet . XML-prosessori ( parser ) on ohjelma, joka jäsentää merkinnät ja välittää tietoa dokumentin rakenteesta toiselle ohjelmalle, sovellukselle.

XML-spesifikaatio asettaa prosessorille tiettyjä vaatimuksia vaikuttamatta sovelluksen vaatimuksiin.

Kelvollinen asiakirja. Vahvistavat ja varmentamattomat prosessorit

Tosite on kelvollinen , jos siihen on liitetty dokumenttityyppimääritelmä ja jos dokumentti noudattaa tositetyypin määrittelyssä esitettyjä rajoituksia.

XML-prosessorit on jaettu kahteen luokkaan: validoiva ja ei-validoiva.

Validointiprosessorit tarkistavat dokumentin kelvollisuuden ja raportoivat (käyttäjän valinnan mukaan) dokumenttityypin määrittelyssä mainittujen rajoitusten rikkomuksista.

Validoimattomat käsittelijät eivät tarkista asiakirjan voimassaoloa, mutta edellä mainitut asiakirjan esikäsittelytehtävät jäävät heille.

Dokumenttityyppien kuvaus: Schema Languages

Kaaviokieliä käytetään asiakirjatyyppien kuvaamiseen .  Koska XML on SGML -kielen osajoukko , se perii SGML:lle kehitetyn Document Type Definition ( DTD ) -kielen. Myöhemmin kehitettiin muita skeemakieliä, joista tunnetuin on XML Schema , RELAX NG .

XML-dokumentin muuntaminen

XSLT on suunniteltu ratkaisemaan ongelma, joka liittyy XML-dokumentin muuntamiseen toiseen skeemaan tai toiseen muotoon .

Asiakirjan renderöintimuoto

Muotoillulle asiakirjalle (renderöimiseen valmisteltu asiakirja) on tarkoitettu XSL-FO- muoto .

Kyselykielet

XPath  on syntaksi puun muodossa esitetyn asiakirjan sisällön osoittamiseksi. XPath - lausekkeita käytetään XQuery - kielessä . XPath-lausekkeita voidaan yleensä käyttää missä tahansa kontekstissa, jossa on tarkoituksenmukaista käyttää muodollisia viittauksia puuelementteihin, erityisesti parametreina dokumenttien käyttöliittymien menetelmiin.

XQuery  on dokumenttisuuntautunut ohjelmointikieli.

XML:n lukeminen: Kolme sovellusliittymää

XML:n lukemiseen on kolme API -vaihtoehtoa [12] .

Event API ( tapahtumaohjattu API, push-tyylinen API ) - XML-prosessori lukee XML:ää; tietyssä tapahtumassa (alku- tai sulkemistunnisteen esiintyminen, tekstimerkkijono, attribuutti) kutsutaan takaisinsoittotoimintoa .

  • + Kuluttaa vähän muistia [12] .
  • + Kun käsitellään valtavaa XML:ää, on vakiopiste, jonka avulla voit pysäyttää käsittelijän välittömästi [12] .
  • - Sovellusohjelmoijalle se on äärimmäisen vaikeaa: täytyy pitää muistissa tieto, missä dokumentin paikassa olemme.
  • + Kirjasto on helppo ohjelmoida.
  • − Vain peräkkäinen pääsy XML:ään [13] , mikä vaikeuttaa ristiviittausten jäsentämistä ja "melkein oikeaa" XML:ää sekalaisen elementtijärjestyksen kanssa.
  • − Vain luku -sovellusliittymä, kirjoittaminen vaatii toisen API:n [14] .
  • ± Luonnollinen valinta, kun valtavasta XML:stä täytyy poimia vähän dataa [12] .
  • ± Luonnollinen valinta, kun XML on muutettava verkkotunnusrakenteeksi [12] .
  • Kirjastoesimerkkejä: SAX , Expat
Kaikki viisi esimerkkiä toimivat tämän XML:n kanssa <?xml version="1.0" encoding="UTF-8" ?> <document> <thing name= "A" > Alfa </thing> <thing name= "B" > Bravo </thing> </document> Esimerkki koodista (C++, kuvitteellinen API) enum class Paikka { JUURI , DOKUMENTTI , ASIA , N } Paikka vanhempiPlace [ static_cast < int > ( Paikka :: N )] = { JUURI , JUURI , ASIAKIRJA } ; luokka MyEvent : julkinen Xml :: Tapahtuma { yksityinen : Paikka paikka = Paikka :: JUURI ; Thing * currThing = nullptr ; julkinen : /// @return true — tunniste tarvitaan; false - ohita se ja kaikki boolissa onTagOpen ( const std :: string & aName ) override ; void onTagClose () override ; 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 ) { kytkin ( paikka ) { kotelo Paikka :: JUURI : if ( aName == "asiakirja" ) { paikka = Paikka :: ASIAKIRJA ; return true ; } tauko ; asia Paikka :: ASIAKIRJA : if ( aName == "asia" ) { paikka = Paikka :: ASIA ; currThing = & asiat . emplace_back (); return true ; } tauko ; } return false ; } mitätöi MyEvent :: onTagClose () { paikka = vanhempiPlace [ paikka ]; } void MyEvent :: onAttr ( const std :: string & aName , const std :: string & aValue ) { if ( paikka == Paikka :: ASIA && aNimi == "nimi" ) currThing -> nimi = aArvo ; } void MyEvent :: onText ( const std :: string & aText ) { jos ( paikka == Paikka :: ASIA ) currThing -> arvo = aText ; } xml :: eventDrivenRead ( "in.xml" , MyEvent ());

Stream API (myös pull-style API ) - järjestetty I/O-virtojen tapaan . Sovelluskoodi kysyy prosessorilta XML:n osia, jotka voivat vain siirtyä eteenpäin XML:n läpi unohtaen jo ohitetut osat.

  • + Kuluttaa vähän muistia.
  • + Tieto, missä asiakirjan paikassa olemme, määräytyy implisiittisesti suoritussäikeen paikan mukaan . Tämä yksinkertaistaa huomattavasti sovellusohjelmoijan työtä [15] [14] . Hyvin harkituissa sovellusliittymissä koodin määrä lähestyy DOM:n määrää.
  • − Kirjastoa on vaikea ohjelmoida.
  • + Mahdollistaa kahden XML-dokumentin samanaikaisen käytön [15] .
  • − Vain peräkkäinen pääsy XML:ään [14] , mikä vaikeuttaa ristiviittausten jäsentämistä ja "melkein oikeaa" XML:ää sekalaisen elementtijärjestyksen kanssa.
  • − Vain luku -sovellusliittymä, kirjoittaminen vaatii toisen API:n. ( StAX on myös suoratoisto, mutta sillä on erillinen suorakirjoitussovellusliittymä [16] .)
  • Kirjastoesimerkkejä: StAX
Esimerkki koodista (C++, kuvitteellinen API) xml :: StreamReader- lukija ( "in.xml" ); std :: merkkijonon nimi , arvo ; lukija . enterTag ( "asiakirja" ); while ( lukija . getTag ( " juttu " ) { Asia juttu ; asia . nimi = lukija . requestStringAttr ( "nimi" ); lukija . enterTag (); asia . arvo = lukija . getText (); lukija . leftTag (); asioita . emplace_back ( std :: liikkua ( asia )); }

Object API ( Document Object Model , DOM, "dokumenttiobjektimalli") - lukee XML:n ja luo sen uudelleen muistiin objektirakenteena.

  • - Käyttää paljon muistia - paljon enemmän kuin XML itse vie levyltä. Pugixml : ssä muistin kulutus on vähintään kolme kertaa XML:n pituus.
  • + Helppo sovellusohjelmoijalle.
  • + Kirjasto on helppo ohjelmoida.
  • + Mahdollistaa satunnaisen pääsyn XML:ään [12] . Tämä esimerkiksi yksinkertaistaa työtä ristiviittauksilla. Usein on mahdollista tunnistaa "melkein oikea" XML sekavalla tunnistejärjestyksellä.
  • + Yhteinen API lukemiseen ja kirjoittamiseen [14] .
  • ± Luonnollinen valinta, kun domain-objekti on itse XML: web- selaimessa [12] , XML-editorissa, tuojassa lokalisointiohjelmaan , joka poimii XML:stä mielivaltaisen rakenteen merkkijonoja.
  • ± Luonnollinen valinta, kun haluat ladata XML:n, muokata hieman uudelleen ja tallentaa [12] [14] . Ne osat, joihin ei tarvitse koskea, eivät vaadi koodia.
  • Kirjastoesimerkkejä: JDOM , TinyXML , pugixml
Esimerkki koodista (C++, pugixml ) #include <iostream> #sisällytä <vektori> #include "pugixml.hpp" struct Thing { std :: merkkijonon nimi , arvo ; }; // Jos jokin pugixml-entiteetti muunnetaan booliksi epätosi, anna virheilmoitus! malli < luokkaT > _ inline T tarve ( T && val , const char * errmsg ) { if ( ! val ) heittää std :: logic_error ( errmsg ); return std :: eteenpäin < T > ( val ); } int main () { std :: vektori < Thing > things ; pugi :: xml_document doc ; need ( doc . load_file ( "in.xml" ), "XML:ää ei voi ladata!" ); auto elDocument = tarve ( doc . root (). lapsi ( "asiakirja" ), "Tarvitaan <dokumentti>" ); for ( pugi :: xml_node elThing : elDocument . children ( " juttu " ) )) { auto attrName = tarve ( elThing . attribuutti ( "nimi" ), "Tarvitaan <asia>.nimi!" ); asioita . emplace_back ( Thing { attrName . as_string (), elThing . text (). as_string () } ); } for ( auto & v : things ) { std :: cout << v . nimi << "=" << v . arvo << std :: endl ; } paluu 0 ; }

On myös hybridi-API:ita: ulkoiset ja merkityksettömät osat luetaan stream-menetelmällä, kun taas sisäiset ja tärkeät osat luetaan objektimenetelmällä.

Esimerkki koodista (C++, kuvitteellinen API) xml :: StreamReader- lukija ( "in.xml" ); std :: merkkijonon nimi , arvo ; lukija . enterTag ( "asiakirja" ); while ( lukija . getTag ( " juttu " ) { xml :: Element * elThing = lukija . readEntireSubtree (); asioita . emplace_back (); Asia & asia = asiat . takaisin (); asia . nimi = elThing . requestStringAttr ( "nimi" ); asia . arvo = elThing . teksti (); }

XML-kirjoitus: kaksi API-vaihtoehtoa

Direct Write API kirjoittaa XML-tunnisteen tunniste kerrallaan, attribuutti attribuutilta.

  • + Nopea, ei väliobjekteja.
  • − Primitiivinen kirjasto voi tuottaa suboptimaalisen XML:n (esim . <tag></tag>sijaan <tag />). Optimaalinen työskentely on paljon vaikeampaa ohjelmoida.
  • − Ei sovellu tiettyihin erityistehtäviin.
  • − Jos aihealueen rakenteet toimivat epäluotettavasti, ilman erikoistoimenpiteitä (kirjoita muistiin tai toiseen tiedostoon, sitten nimeä uudelleen), voit päätyä "pudonneeseen" ohjelmaan ja kadonneeseen tiedostoon.
  • − Ohjelmoijan virhe voi johtaa syntaktisesti virheelliseen XML:ään.
  • - Vain kirjoitussovellusliittymä, lukeminen vaatii toisen API:n.
  • Kirjastoesimerkkejä: StAX .
Esimerkki koodista (C++, kuvitteellinen API) xml :: Writer wri ( "out.xml" ); wri . openTag ( "asiakirja" ); for ( auto & v : things ) { wri . openTag ( "juttu" ); wri . writeAttr ( "nimi" , v . nimi ); wri . kirjoitusteksti ( v . arvo ); wri . closeTag ( "juttu" ); } wri . closeTag ( "asiakirja" );

Object API eli Document Object Model .

  • − Luo XML:lle objektirakenteen, joka voi viedä enemmän muistia kuin toimialuerakenne.
  • ± Universaali (useimmissa tehtävissä ei kuitenkaan ole etua hyvin kehittyneeseen suoran kirjoittamisen sovellusliittymään verrattuna - toisin kuin lukemisessa).
  • + Vaikka verkkotunnuksen rakenteet toimisivat epäluotettavasti ja ohjelmoija ei tarjonnut mitään "suojaa", ainoa skenaario, kun tiedosto korvataan epätäydellisellä, on I / O-virhe (erityisesti levytilan puute).
  • + Hyvin kirjoitetulla API:lla on mahdotonta luoda syntaktisesti virheellistä XML:ää.
  • + Yhteinen API kirjoittamiseen ja lukemiseen.
  • Kirjastoesimerkkejä: sama kuin XML:n lukemisessa DOM-menetelmällä.
Esimerkki koodista (C++, pugixml ) #include "pugixml.hpp" struct Thing { std :: merkkijonon nimi , arvo ; }; Asiat [ ] { { "A" , "Alpha" , }, { "B" , "Bravo" , }, { "C" , "Charlie" } }; int main () { pugi :: xml_document doc ; auto root = doc . append_child ( "asiakirja" ); for ( auto & thing : things ) { autonode = juuri . _ append_child ( "asia" ); solmu . append_attribute ( "nimi" ) = asia . nimi . c_str (); solmu . append_child ( pugi :: node_pcdata ). set_value ( asia . arvo . c_str ()); } doc . save_file ( "test.xml" ); paluu 0 ; }

Dokumenttityökalut: jäsentimet, luonti- ja visualisointityökalut, tietokantajärjestelmät

Jäsentimen toteutukset

XML:ssä on jäsennystoteutuksia kaikille nykyaikaisille ohjelmointikielille [17] .

Verkkoselaimet asiakirjan renderöintityökaluna

Renderöinti ilman CSS-tyylejä

Ilman CSS :n tai XSL :n käyttöä XML-dokumentti hahmonnetaan tavallisena tekstinä useimmissa verkkoselaimissa. Jotkut selaimet, kuten Internet Explorer , Mozilla Firefox ja Opera (Operan sisäänrakennettu Dragonfly - työkalu ), näyttävät asiakirjan rakenteen puuna, jolloin solmut voidaan tiivistää ja laajentaa hiiren napsautuksella.

CSS-tyylien käyttö

Prosessi on samanlainen kuin CSS :n käyttäminen HTML - dokumenttiin näyttöä varten. Jotta CSS:ää voidaan käyttää selaimessa näytettäessä, XML-asiakirjassa on oltava erityinen linkki tyylisivuun. Esimerkiksi:

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

Tämä eroaa HTML-lähestymistavasta, joka käyttää <link>-elementtiä.

Muunnosten käyttäminen XSL-FO-muotoon

Nykyaikaiset selaimet ovat työkaluja, jotka voivat suorittaa XSLT-muunnoksia. Selaimessa tällainen muunnos suoritetaan yleensä asiakirjan alustamiseksi (muunnetaan asiakirja XSL-FO-muotoon). Seuraava lause XML-dokumentin prologissa ohjeistaa selainta suorittamaan transform.xsl-tiedostossa kuvatun XSLT-muunnoksen:

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

XML-editorit

Voit työskennellä XML-dokumentin kanssa tavallisessa tekstieditorissa, mutta tavalliset editorit eivät tue dokumentin rakennetta. On olemassa erityisiä XML-editoreja , jotka tekevät asiakirjan käsittelystä helpompaa ja tehokkaampaa.

Tietokannan hallintajärjestelmät, jotka toimivat XML-muodossa olevien tietojen kanssa

DB2 - tietokannan hallintajärjestelmän avulla voit tallentaa tietoja XML-muodossa ja käyttää tällaisia ​​tietoja XQuery-kielellä.

Laitteistotuki

XML on tuettu alhaisilla laitteisto-, laiteohjelmisto- ja ohjelmistotasoilla nykyaikaisissa laitteistoratkaisuissa [18] .

Laajuus, rajoitukset, kehitysnäkymät

XML:n käytön tehokkuus

XML on merkintäkieli, toisin sanoen väline dokumentin kuvaamiseen. Se on asiakirjojen, tekstien kapealla, jossa heterogeenisten merkkitietojen osuus on suuri ja merkintöjen osuus on pieni - XML ​​on onnistunut. Toisaalta tiedonvaihto avoimissa järjestelmissä ei rajoitu asiakirjojen vaihtoon. XML-merkintöjen redundanssi (ja kielisuunnittelun kannalta on nimenomaisesti todettu, että tiiviys ei ole projektin prioriteetti) vaikuttaa tilanteisiin, joissa data ei sovi perinteiseen dokumenttimalliin. Esimerkiksi uutissyöte, joka on muotoiltu XML-syntaksilla ( RSS , Atom-muodot ), ei ole dokumentti perinteisessä mielessä, vaan samantyyppisten minidokumenttien virta - monisanainen ja redundantti merkintä on tässä tapauksessa olennainen osa lähetetyistä tiedoista.

W3C on huolissaan XML:n tehokkuudesta, ja asiaankuuluvat työryhmät tutkivat asiaa (vuoden 2013 alkuun mennessä ei ole kehitetty normatiivisia asiakirjoja).

Toinen tilanne, jossa XML-muodot eivät ehkä ole paras ratkaisu, on työskenneltäessä datan kanssa, jonka rakenne on yksinkertainen ja jossa on pieni määrä merkkitietoa (tietokenttiä). Tällöin merkintöjen osuus kokonaisvolyymista on suuri ja XML:n ohjelmallinen käsittely voi olla kohtuuttoman kallista verrattuna yksinkertaisemman rakenteen datan kanssa työskentelyyn. Tällä alueella kehittäjät etsivät natiivitietopohjaisia ​​työkaluja, kuten INI , YAML , JSON .

Komentosarjakieli XML:n kanssa työskentelemiseen

W3C työstää skriptikieltä XML:n kanssa työskentelyä varten (vuoden 2013 alkuun mennessä ei ole kehitetty säädösdokumentteja).

Katso myös

  • XML-RPC
  • XML-skeema
  • SOAP ( Simple Object Access Protocol ) on tiedonsiirtoprotokolla , joka käyttää XML - muotoa viesteissä . 
  • LEVÄTÄ
  • XHTML  on HTML -versio, joka täyttää XML:n syntaksivaatimukset.
  • XSD  on kieli XML-dokumenttien rakenteen kuvaamiseen.
  • FB2  - XML-pohjainen kirjan kuvausmuoto
  • W3C DOM
  • DITA
  • WDDX
  • APML

Muistiinpanot

  1. XML-mediatyypit, RFC 3023 9–11. IETF (tammikuu 2001). Haettu 4. tammikuuta 2010. Arkistoitu alkuperäisestä 22. elokuuta 2011.
  2. XML-mediatyypit, RFC 3023 7–9. IETF (tammikuu 2001). Haettu 4. tammikuuta 2010. Arkistoitu alkuperäisestä 22. elokuuta 2011.
  3. M. Murata, D. Kohn ja C. Lilley. Internet-luonnokset: XML-mediatyypit . IETF (24. syyskuuta 2009). Haettu 10. kesäkuuta 2010. Arkistoitu alkuperäisestä 22. elokuuta 2011.
  4. Extensible Markup Language (XML) 1.0 (fifth Edition) . Haettu 6. heinäkuuta 2011. Arkistoitu alkuperäisestä 1. huhtikuuta 2009.
  5. Extensible Markup Language (XML) 1.1 (Second Edition) . Haettu 6. heinäkuuta 2011. Arkistoitu alkuperäisestä 3. heinäkuuta 2011.
  6. 1 2 Selitys sanalle "entity" XML-kielispesifikaatiossa. . Haettu 12. huhtikuuta 2014. Arkistoitu alkuperäisestä 10. tammikuuta 2020.
  7. HTML-asiakirjan esitys . www.w3.org. Haettu 27. marraskuuta 2019. Arkistoitu alkuperäisestä 23. joulukuuta 2019.
  8. Selitys sanalle "pätevä" eritelmässä. . Haettu 12. huhtikuuta 2014. Arkistoitu alkuperäisestä 10. tammikuuta 2020.
  9. Backus-Naura-lomakkeen käyttö spesifikaatiossa. . Haettu 12. huhtikuuta 2014. Arkistoitu alkuperäisestä 10. tammikuuta 2020.
  10. Tyhjän tilan kirjoittaminen muodossa Backus - Naur. . Haettu 12. huhtikuuta 2014. Arkistoitu alkuperäisestä 10. tammikuuta 2020.
  11. Jos käytetään sekä ulkoista että sisäistä osajoukkoa, sisäisen osajoukon TÄYTYY katsoa esiintyvän ennen ulkoista osajoukkoa.
  12. 1 2 3 4 5 6 7 8 Xml jäsennys . Haettu 30. elokuuta 2019. Arkistoitu alkuperäisestä 16. maaliskuuta 2022.
  13. Suoratoisto vastaan ​​DOM (The Java EE 5 Tutorial) . Haettu 9. huhtikuuta 2022. Arkistoitu alkuperäisestä 9. huhtikuuta 2022.
  14. 1 2 3 4 5 Staxin vertailu muihin JAXP-sovellusliittymiin (Java EE 5 -opetusohjelma) . Haettu 9. huhtikuuta 2022. Arkistoitu alkuperäisestä 9. huhtikuuta 2022.
  15. 1 2 Pull Parsing vs Push Parsing (Java EE 5 Tutorial) . Haettu 9. huhtikuuta 2022. Arkistoitu alkuperäisestä 9. huhtikuuta 2022.
  16. StAX API (Java™-opetusohjelmat > Java API XML-käsittelyyn (JAXP) > Streaming API for XML) . Haettu 9. huhtikuuta 2022. Arkistoitu alkuperäisestä 9. huhtikuuta 2022.
  17. XML-jäsentimet (downlink) . Haettu 11. maaliskuuta 2009. Arkistoitu alkuperäisestä 3. maaliskuuta 2009. 
  18. Intel XML Accelerator  (downlink)

Kirjallisuus

  • David Hunter, Jeff Rafter, Joe Faucette, Eric van der Vlist ym. XML. Työskentely XML:n kanssa, 4. painos = XML:n alku, 4. painos. - M . : "Dialektiikka" , 2009. - 1344 s. — ISBN 978-5-8459-1533-7 .
  • David Hunter, Jeff Rafter ym. XML. Peruskurssi = XML:n alku. — M .: Williams , 2009. — 1344 s. — ISBN 978-5-8459-1533-7 .
  • Robert Tabor. Microsoft .NET XML Web Services Implementation = Microsoft .NET XML Web Services. - M .: Williams , 2002. - 464 s. - ISBN 0-672-32088-6 .

Linkit