Inleiding tot XML-DTD. Basisprincipes van het gebruik van XML-schema's om elementen te definiëren

Spiekbriefje aan DTD .

DTD – Een van de manieren om de documentindeling formeel te beschrijven XML , gemaakt in een taal die begrijpelijk is voor het analyseprogramma.

Wordt momenteel uitgefaseerd DTD in het voordeel XSD (XML-schemadefinitie ), om een ​​aantal redenen:

  • DTD gebruikt anders dan XML syntaxis.
  • Er is geen knooppunttypering.
  • Er is geen ondersteuning voor naamruimten.

Niettemin wordt deze methode nog steeds veel gebruikt omdat deze eenvoudiger en handiger is voor het beschrijven van eenvoudige documentlay-outs.

CONSTRUCTIES DTD

De schemabeschrijving bestaat uit opmaakdeclaraties ( opmaakdeclaratie ), beginnend met een paar tekens “ gevolgd door een van de woorden:

  • ELEMENT (geeft aan dat het wordt aangekondigd element )
  • ATTLIST (attributenlijst )
  • ENTITEIT (essence )
  • NOTATIE (aanduiding )

de opmaakdeclaratie eindigt met “ >

ELEMENTTYPEVERKLARING

(elk element van het document moet worden beschreven)

Inhoud:

  • LEEG – leeg (bijv
    )
  • ELK – elke inhoud (zeldzaam)
  • (#PCDATA) – alleen tekengegevens
  • (lijst met namen van geneste elementen, gescheiden door komma's) – geneste elementen moeten in het document voorkomen in de volgorde waarin ze in de aangifte worden vermeld. Er wordt slechts één nestingniveau gedeclareerd. Elementen kunnen worden gegroepeerd met behulp van haakjes.
    Een scheidingsteken gebruiken | tussen elementen geeft aan dat een van de gescheiden elementen voorkomt.
    Na elementen of haakjes:
    • ? – komt 0 of 1 keer voor
    • * – 0 of meerdere keren
    • + – 1 of meerdere keren

ATTRIBUTEN VERKLAREN

Attributen worden gedeclareerd nadat het element zelf is gedeclareerd. Alle attributen van één element worden in één keer gedeclareerd, in één lijst.

Voor elk attribuut worden de naam, het type en de verplichte status vastgelegd.

Kenmerktypen:
  • CDATA – (Tekenset van gegevens ) tekenreeks
  • Lijst met attribuutwaarden tussen haakjes, vermeld met “|”
  • Identiteitskaart – unieke identificatie
  • IDREF – een identificatie die een van de attribuutwaarden bevat Identiteitskaart , gebruikt als verwijzing naar andere elementen
  • IDREFS – een identificatie die een reeks typeattribuutwaarden bevat Identiteitskaart , gescheiden door een spatie, wordt ook gebruikt als link naar meerdere elementen tegelijk.
  • ENTITEIT – de naam van de entiteit die niet door de analysator is gecontroleerd ( verklaard in dezelfde beschrijvingDTD )
  • ENTITEITEN – namen van entiteiten die niet door de analysator zijn gecontroleerd.
  • NMTOKEN – een woord dat alleen tekens bevat die in namen worden gebruikt ( namen van andere elementen of attributen, om er bijvoorbeeld naar te verwijzen)
  • NMTOKENS – woorden vermeld, gescheiden door spaties
  • NOTATIE - aanduiding ( aanduidingen ontcijferd in de beschrijvingDTD)
  • NOTATIES – lijst met notaties
teken van verplichting:
  • Standaard attribuutwaarde– wordt tussen aanhalingstekens aangegeven en betekent dat het attribuut optioneel is.
  • # VEREIST– het attribuut moet in het element geschreven zijn.
  • # IMPLICIET– het attribuut is optioneel, het heeft geen standaardwaarde.
  • # VAST– het attribuut heeft slechts één waarde, de kat wordt onmiddellijk gescheiden door een spatie geschreven.

Wanneer u naamruimten gebruikt, moet u altijd de gekwalificeerde ( QNaam), geen lokale naam.

Kenmerken zijn niet opgenomen in de standaardnaamruimte.

Kenmerken “ xml:lang " En " xml:ruimte ” moet ook worden aangegeven in DTD in geval van gebruik ervan

AANGIFTE VAN ENTITEITEN

(begin met “&” en eindig met “;”)

Interne entiteiten– worden ingesteld bij het declareren van een entiteit.

- kan verder in de zeer worden gebruikt DTD Hieronder staat de advertentie.

Externe entiteiten– zijn opgenomen in een apart bestand of ingebouwd in het analyseprogramma.

Geparametriseerde entiteiten– alleen gebruikt binnen de beschrijving DTD

Entiteiten zijn onderverdeeld in geparseerde ( ontleed ) en niet geparseerd ( ongeparseerd ). Geparseerd vertegenwoordigt een fragment van een document XML of het hele document en worden na vervanging door het analyseprogramma verwerkt. Nadat de demontage is vervangen, wordt de entiteit een onderdeel XML document.

Binaire programmacode, tekening, afbeelding etc. hoeven niet middels middelen te worden verwerkt XML Hiervoor moet de entiteit niet geparseerd worden verklaard. Om dit te doen, wordt aan het einde van de entiteitsverklaring een aantekening gemaakt “ NDATA ” en de aanduiding wordt aangegeven ( notatie ) van het ingevoegde object.

VOORGEDEFINIEERDE ENTITEITEN IN XML

AANKONDIGINGSSYMBOOL ( NOTATIE)

Ze worden verklaard als entiteiten; ze kunnen ook intern en extern zijn.

Intern

Extern

SYSTEEM | OPENBAAR - in dit geval zijn gelijkwaardig omdat in het openbaar is er niet noodzakelijkerwijs een bekende link.

ACCOMMODATIE DTD

Of in een apart bestand “ *.dtd ' door zijn naam tussen aanhalingstekens te vermelden in het tweede deel van de proloog DOCTYPE , of neem de beschrijving rechtstreeks op in het tweede deel van de proloog, tussen vierkante haken.

]> bla

Dat is precies wat ze zijn. Bovendien zorgt XML zelf voor uitbreidbaarheid. Documenten die met deze talen zijn gemaakt, kunnen ‘goed opgemaakt’ en ‘geldig’ zijn.

Er zijn geen problemen om het document op juistheid te controleren: als er geen fouten verschijnen en alles wordt weergegeven zoals we wilden, dan is het document correct. Als u bijvoorbeeld iets schrijft als ' Hallo!", dan is ons document volledig correct, maar genegeerd door de browser. Waarom? Omdat de browser niets weet over wat voor soort “Z” dit is. En als wij ons document met een validator op geldigheid controleren, wordt het document niet als zodanig herkend. Hoe weet de validator hiervan en op basis waarvan heeft hij een dergelijk oordeel geveld?

De geldigheid wordt gecontroleerd met behulp van een documenttypedefinitie (DTD). Voor 'strikte' HTML ziet het er bijvoorbeeld zo uit.

Een DTD kan zowel in een document worden beschreven als in een apart bestand worden geplaatst (analoog aan CSS: ingebouwde en plug-in stylesheets).

DTD-aangifte

De DTD-declaratie wordt vóór het eerste (root)element van het document geplaatst, beginnend met de reeks " ».

De interne DTD wordt als volgt beschreven:

Tussen de vierkante haken staat de inhoud van de DTD, de zogenaamde interne deelverzameling, Bijvoorbeeld:

] >

Als de DTD in een apart bestand wordt geplaatst (meestal met de extensie .dtd), wordt de verklaring ervan in het document als volgt geschreven:

Dienovereenkomstig zijn alle regels in dit bestand geschreven, het zogenaamde externe subset.

De naam na het woord "DOCTYPE" (in ons geval "catalogus") moet overeenkomen met de naam van het hoofdelement. Dat wil zeggen, het XML-document zou er ongeveer zo uit moeten zien:

Hallo wereld!

In plaats van het trefwoord "SYSTEEM" kan het woord "PUBLIC" worden gebruikt om aan te geven dat de DTD bedoeld is voor algemeen gebruik:

Binnenste en buitenste subsets kunnen gelijktijdig worden gespecificeerd (opnieuw vergelijkbaar met CSS):

] >

Hier wordt eerst de inhoud van het bestand “catalog.dtd” gelezen en vervolgens de inhoud die tussen vierkante haakjes is opgegeven.

Documentelementen

Elementen worden in de DTD gedeclareerd met het trefwoord "ELEMENT", gevolgd door de naam van het element en de inhoud ervan, tussen haakjes:

Als een element onderliggende elementen heeft, wordt het als volgt geschreven:

wat overeenkomt met het document:

</book> </p><p>Als een element meerdere onderliggende elementen heeft, worden deze gescheiden door komma's weergegeven en moeten ze strikt in de opgegeven volgorde worden gevolgd:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> </p><p>Het bovenstaande voorbeeld luidt als volgt. Het element "book" mag slechts één element "title" bevatten, gevolgd door slechts één element "author". De elementen “titel” en “auteur” bevatten zelf geen elementen, maar kunnen alleen wat tekst bevatten.</p> <p>De volgende speciale tekens kunnen worden gebruikt om de aanwezigheid van een element te kwantificeren:</p> <ul><li>Het teken "*" na een element betekent dat het element één of meerdere keren aanwezig kan zijn, of helemaal niet aanwezig kan zijn (van nul tot + oneindig)</li> <li>Het "+" symbool achter een element betekent dat het element één of meerdere keren kan voorkomen (van 1 tot + oneindig)</li> <li>symbool"? ", volgend op het element, betekent dat het element afwezig of slechts één keer aanwezig kan zijn (0 of 1)</li> </ul> <!ELEMENT book (title, author)> ... <!ELEMENT book (title*, author)> ... <!ELEMENT book (title+, author)> ... <!ELEMENT book (title?, author)> <p>Als het nodig is om een ​​van meerdere elementen aan te geven (titel of auteur - elk van deze, maar niet beide), moet u het symbool " | ":</p><p> <!ELEMENT book (title | author)> </p><p>De tekst is ook een gelijkwaardige deelnemer aan het spel. Het trefwoord "PCDATA" geeft aan dat tekengegevens moeten worden geparseerd, dus elke tekst die opmaaktekens bevat ("< », « >" en " & ") worden behandeld als opmaak. Het delen van tekst en elementen heet <i>gemengde inhoud</i>. Bij het declareren van gemengde inhoud moet eerst "PCDATA" worden opgegeven:</p><p> <!ELEMENT book (#PCDATA | title | author)> </p><p>Het volgende documentfragment is geldig voor het bovenstaande voorbeeld:</p><p> <book> <title /> </book> <book> <author /> </book> <book>Geen gegevens</book> </p><p>Groepen elementen staan ​​tussen haakjes. Het "book"-element moet tekst bevatten of (één "titel", één of meer "auteur" en misschien één "pubyear" in die volgorde):</p><p> <!ELEMENT book (#PCDATA | (title, author+, pubyear?))> <!ELEMENT disc (#PCDATA | title)*> </p><p>Het volgende XML-documentfragment komt overeen met dit voorbeeld:</p><p> <disc /> <book> <title /> <author /> <author /> </book> <book>Geen gegevens</book> </p><p>Het element kan leeg zijn. Zo'n element mag geen onderliggende elementen of tekst bevatten (bijvoorbeeld het "br"-element in HTML). Een dergelijk element wordt gespecificeerd met het trefwoord "EMPTY":</p><p> <!ELEMENT photo EMPTY> </p><p>Een element kan ook worden gedeclareerd met het trefwoord "ANY", wat betekent dat het element zowel elementen als tekst kan bevatten, allemaal, en zelfs leeg kan zijn.</p> <h3>Elementattributen</h3> <p>Elementen in een XML-document kunnen attributen hebben, die worden geschreven als "naam=waarde" in de openingstags of lege tags. Een algemene declaratie van de attributen van een bepaald element begint met het sleutelwoord "ATTLIST", gevolgd door de naam van het element en de declaratie van de attributen zelf:</p><p> <!ELEMENT title (#PCDATA)> <!ATTLIST title id CDATA #REQUIRED stock CDATA #IMPLIED> </p><p>Het trefwoord "REQUIRED" geeft aan dat het attribuut vereist is. Het trefwoord "IMPLIED" zegt daarentegen dat het attribuut optioneel is.</p> <p>Attributen kunnen een lijst met toegestane waarden hebben:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED> </p><p>De standaardwaarde kan ook worden ingesteld:</p><p> <!ATTLIST title readonly (yes|no) #REQUIRED "yes">pubjaar CDATA #IMPLICIET "2007"></p><p>Een attribuut kan ook een constante zijn, dat wil zeggen dat het alleen de waarde kan hebben die is aangegeven in de attribuutdeclaratie. Dit gebeurt met behulp van het trefwoord “FIXED”:</p><p> <!ATTLIST title copyright <strong>#VAST "udvikler"></p><p>Het attribuuttype "CDATA" staat het gebruik van alle tekens toe, behalve "< », « >", " & ", " " " En " " ". Indien gebruikt, moeten deze tekens worden vervangen door speciale tekens zoals "< » и т.п. Внимание : в DTD ключевое слово « CDATA » имеет другое значение, чем раздел « CDATA » в XML-документе!</p> <p>Naast het CDATA-type kunnen attributen de volgende typen hebben:</p> <ul><li>NMTOKEN - kan alleen letters, cijfers, ". ", " - ", " _ " En " : "</li> <li>NMTOKENS - kan dezelfde tekens bevatten als "NMTOKEN" plus spatie, regelterugloop, regelinvoer en tabtekens</li> </ul> <!ATTLIST title id CDATA #REQUIRED stock NMTOKEN #IMPLIED publisher NMTOKENS #IMPLIED> <p>Een ander attribuuttype, 'ID', staat dezelfde waarden toe als het NMTOKEN-type, maar de waarde moet beginnen met een letter, '_', of ':'. Elk element kan slechts één attribuut van het type "ID" hebben. Een attribuut van het type 'ID' kan geen constante zijn (gedeclareerd als 'FIXED'). De waarde van een attribuut van het type "ID" moet uniek zijn in het hele XML-document:</p><p> <!ELEMENT book (title, author)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ATTLIST title id ID #REQUIRED stock CDATA #IMPLIED> <!ATTLIST author id ID #REQUIRED city CDATA #IMPLIED> </p><p>Een elementattribuut kan een verwijzing zijn naar een attribuut van het type "ID" van een ander element. Om dit te doen, wordt het gedeclareerd als een attribuut van het type "IDREF". Als een attribuut moet verwijzen naar een attribuut van het type "ID" van meerdere elementen, dan wordt het trefwoord "IDREFS" gebruikt:</p><p> <!ELEMENT book (title+, author, year, publisher)> <!ELEMENT title (#PCDATA)> <!ELEMENT author (#PCDATA)> <!ELEMENT year (#PCDATA)> <!ELEMENT publisher (#PCDATA)> <!ATTLIST title id ID #REQUIRED> <!ATTLIST author id ID #REQUIRED> <!ATTLIST year ref IDREF #REQUIRED> <!ATTLIST publisher from IDREFS #REQUIRED> </p><p>In het XML-document ziet het er als volgt uit:</p><p> <book> <title id="t1" /> <title id="t2" /> <title id="t3" /> <author id="a1" /> <year ref="t2" /> <publisher from="t1 t2 a1" /> </book> </p><h3>Entiteiten declareren</h3> <p>Naast elementen en hun attributen kunnen we definiëren <i>essence</i>, geschreven met het trefwoord "ENTITY":</p><p> <!ENTITY name "SuperMegaMaster"> </p><p> <userName>&name;</userName> </p><p>Als gevolg hiervan wordt de entiteitsnaam “naam” vervangen door de waarde ervan, in ons geval “SuperMegaMaster”.</p> <p>En om ons geluk compleet te maken, moeten we hieraan toevoegen dat de eigenschappen van elementen vergelijkbare entiteiten als betekenissen kunnen hebben - <i>entiteit-attributen</i>. Ze worden ook gedefinieerd met het trefwoord "ENTITY", maar hebben één beperking: ze moeten verwijzen naar externe, niet-geparseerde entiteiten die zijn gedefinieerd in de externe subset van de DTD:</p><p> <!DOCTYPE catalog [ <!ENTITY list SYSTEM "companyList.html" NDATA parse> <!ELEMENT catalog (user+)> <!ELEMENT user (name)> <!ATTLIST user company ENTITY #REQUIRED> <!ELEMENT name (#PCDATA)> ] > </p><p>In het bovenstaande voorbeeld wordt een entiteit "lijst" gedeclareerd die verwijst naar een extern document "companyList.html". Het trefwoord "NDATA" geeft aan dat het externe document geen XML-document is. Vervolgens wordt voor het element “user” het attribuut “company” gedeclareerd, dat verplicht is en van het type “ENTITY” is, dat wil zeggen dat het naar een entiteit verwijst. Omdat in ons voorbeeld slechts één entiteit (“lijst”) is gespecificeerd, kan deze de waarde zijn van het attribuut “bedrijf” in het XML-document:</p><p> <catalog> <user company="list"> <name>SuperMegaMaster</name> </user> </catalog> </p><p>Het enige dat overblijft is om te begrijpen wat 'parse' betekent in de declaratieregel van de 'lijst'-entiteit? Wanneer u niet-geparseerde gegevens gebruikt, dat wil zeggen gegevens die niet door de XML-parser zijn geparseerd, is het een goed idee om de toepassing (met behulp van het XML-document) te vertellen hoe de entiteit moet worden verwerkt als dat toch nodig is. Om dit te doen, moeten we de notatie gebruiken die is gespecificeerd door het trefwoord “NOTATION” en onze DTD als volgt aanvullen:</p><p> <!NOTATION parse SYSTEM "iexlorer"> <!ENTITY list SYSTEM "companyList.html" NDATA parse> </p><p>Het woord "parse" in de entiteitsdeclaratie van het blad geeft aan hoe u het bestand "companyList.html" kunt parseren - zoek naar een notatie met de naam "parse" en volg de instructies ervan. In ons geval kan de applicatie MS InternetExplorer openen en het document “companyList.html” erin laden.</p> <p>Annotatie: <span>In dit gedeelte worden de algemene principes van schrijven beschreven. Het definiëren van het documenttype. Ook worden de belangrijkste nadelen en kenmerken van DTD besproken.</p><h3>Waarom heb je een DTD nodig?</h3><p>Bij het maken van een XML-document beslist de ontwikkelaar zelf: hoe hij de tags een naam geeft, in welke volgorde ze zullen verschijnen, welke gegevens in een bepaald element zullen worden geschreven, of het element attributen zal hebben of niet, en nog veel meer. Zonder een formele beschrijving van de documentstructuur kan alleen de ontwikkelaar dit document gebruiken. Als het ontwikkelde XML-document bedoeld is voor verzending naar de buitenwereld, bijvoorbeeld naar zakenpartners, en als u ook van plan bent om als reactie hierop documenten te ontvangen die in hetzelfde formaat zijn geschreven, kunt u niet zonder documenttypedefinitie (DTD). Dit komt door het feit dat, om beide partijen de ontvangen informatie te laten begrijpen, de elementen en attributen in de documenten door alle partijen op dezelfde manier moeten worden gebruikt. Documenttypedefinities zorgen voor strengheid en precisie in de regels voor het schrijven van goed opgemaakte XML-documenten. Documenttypedefinities worden aan het begin van een XML-bestand of extern als *.DTD-bestand opgeslagen en beschrijven de informatiestructuur van een document. De DTD somt mogelijke elementnamen op, definieert de beschikbare attributen voor elk elementtype en beschrijft het nesten van elementen.</p><p>XML wordt gebruikt als middel om de grammatica van andere talen te beschrijven. En dus zullen we bij het ontwikkelen van een taal voor het schrijven van XML-documenten op een bepaald gebied een woordenboek voor dit werkgebied moeten ontwikkelen. DTD's bevatten per definitie alle informatie die in een XML-document kan voorkomen. Alles wat bij het project hoort, moet in de DTD worden opgenomen. De beschrijving DTD is dus in wezen zo'n woordenboek. De moderne wereld verandert behoorlijk dynamisch, dus het is niet van tevoren bekend welke informatie in de toekomst nodig kan zijn, en om te voorkomen dat de structuur van documenten vaak moet worden gewijzigd, bevat een doorgaans ontwikkeld woordenboek alles wat nodig kan zijn voor specifieke informatie. soorten bedrijven of bedrijfstakken. Hierdoor kunnen DTD-definities worden gebruikt als analyse- en ontwerptool. XML-applicaties communiceren met elkaar op basis van de vocabulaires die ze begrijpen, dus het definiëren van een DTD helpt begrijpen wat de applicatie kan beschrijven.</p><p>Een ander gebruik van DTD is het controleren van de juistheid van een geschreven XML-document. Goed opgemaakte documenten, geschreven volgens alle regels beschreven in de XML-specificatie, kunnen niet op fouten worden gecontroleerd. Gemiste fouten kunnen schade veroorzaken aan het programma dat deze documenten verwerkt, of het invoeren van onjuiste gegevens in het systeem. Maar als het document verwijst naar een DTD-definitie, kunnen we met behulp van een validatieparser controleren of er fouten in ons document zitten. De parser vraagt ​​de DTD op en zorgt ervoor dat het document de daarin beschreven grammaticale regels volgt. De analyser detecteert structurele en inhoudelijke fouten, waardoor het aantal controles door de applicatielogica aanzienlijk wordt verminderd.</p> <h3>DTD-definities schrijven: algemene principes.</h3> <h4>Een DTD koppelen aan een XML-document</h4><p>XML 1.0 biedt een speciale DOCTYPE-declaratie om een ​​DTD-declaratie aan een documentinstantie te koppelen. Het moet de XML-declaratie volgen en voorafgaan aan eventuele documentelementen. Er kunnen echter opmerkingen en verwerkingsopdrachten voorkomen tussen de XML- en DOCTYPE-declaraties.</p><p>Een DOCTYPE-declaratie bevat het trefwoord DOCTYPE, gevolgd door de naam van het hoofdelement van het document, en vervolgens een inhoudsdeclaratieconstructie. Voordat u deze verklaring uitlegt, moet u eerst een voorbeeld bekijken van de locatie van een DOCTYPE-declaratie in een documentinstantie. Hieronder staan ​​de eerste drie regels van het XML-document:</p><p>.. <xml version ="1.0" ?> <!DOCTYPE root_element_name … > <root_element_name > …</p><p>U kunt de buitenste subset van declaraties in een apart DTD-bestand schrijven, de binnenste subset opnemen in de hoofdtekst van de DOCTYPE-declaratie, of beide. In het laatste geval (door interne en externe DTD's te combineren) kunnen nieuwe declaraties worden gespecificeerd in de interne DTD's of kunnen de declaraties in de externe worden herschreven (volgens de definitie van de XML-specificatie lezen parsers eerst de interne subset, en dus de declaraties die daar zijn opgenomen, hebben voorrang).</p><p>XML-declaraties kunnen een zelfstandig attribuut bevatten, dat alleen de waarden "ja" en "nee" accepteert. Als de attribuutwaarde ja is, hebben declaraties buiten de documentinstantie geen invloed op de informatie die door het document wordt overgebracht naar de toepassing die er gebruik van maakt. De waarde nee geeft aan dat er externe declaraties zijn met waarden die nodig zijn om de inhoud van het document goed te beschrijven, bijvoorbeeld specifieke standaardwaarden. In de praktijk wordt het optionele standalone attribuut zelden gebruikt. Het instellen van dit attribuut op ja garandeert niet de afwezigheid van externe afhankelijkheden van welk type dan ook. Het is alleen zo dat externe afhankelijkheden in dit geval niet tot een fout in het document zullen leiden als ze niet bij de verwerking worden betrokken. Dus eigenlijk is dit attribuut een teken voor parsers en andere applicaties die aangeven of ze externe inhoud moeten gebruiken.</p><p>Het interne declaratieblok van de opmaak van de DOCTYPE-tag bestaat uit een vierkante haak links, een lijst met declaraties en een vierkante haak rechts:</p><p>Interne DTD's zijn erg handig; ze zijn altijd opgenomen in het document dat ze gebruikt en kunnen daarom gemakkelijk door de parser worden opgehaald. Interne DTD's vergroten de documentgrootte echter aanzienlijk. In de praktijk worden interne DTD's meestal gelijktijdig met externe gebruikt om nieuwe aangiften toe te voegen. Als daar een object wordt gedeclareerd dat ook in de buitenste DTD is gedeclareerd, heeft de binnenste voorrang. Hierdoor kunt u de aangiften afstemmen op de behoeften van specifieke documenten.</p><p>Externe DTD's zijn in sommige opzichten flexibeler. In dit geval bestaat de DOCTYPE-declaratie uit het gebruikelijke trefwoord en de naam van het rootelement, gevolgd door een ander trefwoord, SYSTEM of PUBLIC, dat de bron van de externe DTD-definitie aangeeft, gevolgd door de lokalisatie van die definitie. Als het trefwoord SYSTEM is, moet de DTD zich direct en expliciet op de opgegeven URL bevinden.</p><p>Als externe DTD's heel vaak worden herschreven, beginnen ze hun betekenis te verliezen, wat een teken is van een slecht aanvankelijk ontwerp.</p><p>Het trefwoord PUBLIC is bedoeld voor bekende woordenboeken. Een toepassing die een document uit dit woordenboek parseert, moet een strategie gebruiken om de juiste DTD te vinden.</p><p>De XML 1.0-standaard staat toe dat een PUBLIC-declaratie zowel een publieke URI als een systeem-ID heeft. Als een applicatie of parser die een document uitvoert geen DTD kan vinden van een URI met het PUBLIC trefwoord, moet deze de systeem-ID gebruiken.</p> <h4>Basisopmaakdeclaraties</h4><p>De toegestane inhoud in een XML-document wordt bepaald door vier soorten opmaakdeclaraties in de DTD. De volgende tabel toont de trefwoorden die bij deze verklaringen horen en hun betekenis:</p><p>De eerste twee typen hebben betrekking op de informatie die we verwachten aan te treffen in een XML-document: elementen en attributen.</p><p>De laatste twee typen worden gebruikt ter ondersteuning. XML-entiteiten maken het leven van de ontwikkelaar van een woordenboek bijzonder gemakkelijk. Meestal bestaan ​​ze uit inhoud die zo vaak wordt gebruikt in de DTD of het document dat dit de aanmaak van een speciale verklaring rechtvaardigt. Het gebruik van deze declaratie doet denken aan de include-instructie in de C/C++-talen, waarbij een naam wordt gebruikt ter vervanging van de inhoud.</p><p>Notaties beschrijven inhoud die niet in XML is geschreven. Ze worden gebruikt om een ​​specifieke gegevensklasse te declareren en deze aan een extern programma te koppelen. Dit externe programma wordt een handler voor de gedeclareerde gegevensklasse. Nadat de ontwikkelaar bijvoorbeeld een JPEG-afbeelding aan een document heeft gekoppeld, wil hij dat het programma binaire gegevens in dat formaat accepteert en weergeeft. In dit geval hangt het document uiteraard af van het soort afhandelaar dat beschikbaar is op het systeem dat het document ontvangt. In het belang van de portabiliteit bieden sommige auteurs geen links naar handlers. In dit geval wordt de notatie eenvoudigweg een typemechanisme.</p> <p>Gebruik XML-schema's in plaats van DTD's om de structuur van XML-documenten te definiëren</p> <p>XML-schema is krachtiger dan DTD. Om de voordelen van het gebruik van de XML Schema-engine te illustreren, vergelijken de eerste drie lijsten verschillende manieren om elementen weer te geven. Het volgende is een fragment uit het XML-document. B toont de twee elementen die zijn gedeclareerd in de DTD-syntaxis, en B toont de syntaxis die overeenkomt met het XML-schema. Merk op dat de syntaxis in Listing 3 vergelijkbaar is met de XML-syntaxis. Bij gebruik van een schema kan de validerende parser controleren of het InvoiceNo-element een positief geheel getal is en of de ProductID uit een bepaalde set tekens bestaat (zes cijfers en één letter van A tot Z). De parser die de DTD-definitie verwerkt, kan alleen bevestigen dat de gegeven elementen strings zijn.</p><h5>Lijst 1: XML-documentfragment</h5><span> <InvoiceNo>123456789</InvoiceNo> <ProductID>J123456</ProductID> </span><h5>Listing 2: DTD-fragment dat de elementen uit Listing 1 beschrijft</h5><span> <!ELEMENT InvoiceNo (#PCDATA)> <!ELEMENT ProductID (#PCDATA)> </span><h5>Lijst 3: XML-schemafragment dat de elementen uit Lijst 1 beschrijft</h5><span> <element name="InvoiceNo" type="positive-integer"/> <element name="ProductID" type="ProductCode"/> <simpleType name="ProductCode" base="string"> <pattern value="(1)d(6)"/> </simpleType> </span><h2>Naamruimten gebruiken in XML-schema</h2><h5>DTD-beperkingen</h5><p>Hoewel DTD's SGML- en HTML-ontwikkelaars al twintig jaar dienen als mechanisme voor het beschrijven van gestructureerde informatie, hebben DTD's enkele beperkingen vergeleken met XML-schema's.</p><p>Volgens de DTD kan een element op drie manieren worden weergegeven:</p><ul><li>Tekstreeks</li><li>Tekstreeks gemengd met een ander onderliggend element</li><li>Aantal kinderen</li> </ul><p>DTD's hebben geen XML-syntaxis en bieden slechts beperkte ondersteuning voor typen en naamruimten.</p><p>Bij samenwerking kan de ene partij de documenten van de andere partijen verwerken, en kunnen verschillende partijen hun gegevenselementen op verschillende manieren weergeven. Bovendien moeten ze in een afzonderlijk document mogelijk onafhankelijk verwijzen naar elementen met dezelfde naam die door verschillende partijen zijn gemaakt. Met behulp van XML Schema kunnen definities met dezelfde naam worden onderscheiden door verschillende naamruimten te definiëren.</p><p>Zo'n XML-schema definieert een reeks nieuwe namen, zoals de namen van elementen, typen, attributen en attribuutgroepen, waarvan de definities en declaraties in het schema worden beschreven. De namen zijn gedefinieerd als InvoiceNo , ProductID en ProductCode .</p><p>De namen die in het schema zijn gedefinieerd, behoren tot de zogenaamde <i>doelnaamruimte</i>. De naamruimte zelf is een vaste, willekeurige naam die de URL-syntaxis moet volgen. De naamruimte voor het schema dat wordt weergegeven in , kan bijvoorbeeld als volgt worden ingesteld: http://www.SampleStore.com/Account.</p><p>De syntaxis voor het declareren van een naamruimte kan soms verwarrend zijn. De declaratie begint met http:// , maar linkt niet naar het schemabestand. In feite leidt de link http://www.SampleStore.com/Account helemaal niet naar een bestand, maar alleen naar de toegewezen naam.</p><p>Definities en declaraties in een schema kunnen verwijzen naar namen die mogelijk tot andere naamruimten behoren. In dit artikel verwijzen we naar naamruimten als: <i>originele naamruimten</i>. Elk schema kan één doelnaamruimte en mogelijk meerdere bronnaamruimten definiëren. Over het algemeen behoort elke naam in een bepaald schema tot een bepaalde naamruimte. Naamruimtenamen kunnen behoorlijk lang zijn, maar ze kunnen worden ingekort met behulp van de xmlns-declaratiesyntaxis in het XML-schemadocument. Al deze concepten worden geïllustreerd in.</p><h5>Lijst 4: Bestemmings- en bronnaamruimten</h5><span> <!--XML Schema fragment in file schema1.xsd--> <xsd:schema targetNamespace="http://www.SampleStore.com/Account" xmlns:xsd="http://www.w3.org/1999/XMLSchema" xmlns:ACC= "http://www.SampleStore.com/Account"> <xsd:element name="InvoiceNo" type="xsd:positive-integer"/> <xsd:element name="ProductID" type="ACC:ProductCode"/> <xsd:simpleType name="ProductCode" base="xsd:string"> <xsd:pattern value="(1)d(6)"/> </xsd:simpleType> </span><p>In het XML-schema dat wordt weergegeven met , is de naamruimte targetNamespace http://www.SampleStore.com/Account en bevat deze de namen InvoiceNo , ProductID en ProductCode . De namen schema , element , simpleType , pattern , string en positive-integer behoren tot de oorspronkelijke naamruimte http://www.w3.org/1999/XMLSchema , die wordt afgekort als xsd door xmlns te declareren. Er is niets bijzonders aan de xsd-alias; je kunt een andere naam kiezen. Voor het gemak en de eenvoud zullen we in de rest van het artikel het xsd-voorvoegsel gebruiken om te verwijzen naar de http://www.w3.org/1999/XMLSchema-naamruimte, waarbij we de xsd-kwalificatie in sommige delen van de code weglaten. In ons voorbeeld is targetNamespace ook een van de oorspronkelijke naamruimten, omdat de ProductCode-naam wordt gebruikt in de definitie van andere namen.</p><h5>Figuur 1: Naamruimten voor listing 4</h5><h5>Lijst 5: Naamruimten met meerdere bronnen, import van naamruimten</h5><span> <!--XML Schema fragment in file schema1.xsd--> <schema targetNamespace="http://www.SampleStore.com/Account" xmlns="http://www.w3.org/1999/XMLSchema" xmlns:ACC= "http://www.SampleStore.com/Account" xmlns:PART= "http://www.PartnerStore.com/PartsCatalog"> <import namespace="http://www.PartnerStore.com/PartsCatalog" schemaLocation="http://www.ProductStandards.org/repository/alpha.xsd"/> <element name="InvoiceNo" type="positive-integer"/> <element name="ProductID" type="ACC:ProductCode"/> <simpleType name="ProductCode" base="string"> <pattern value="(1)d(6)"/> </simpleType> <element name="stickyGlue" type="PART:SuperGlueType"/> </span><p><img src='https://i0.wp.com/ibm.com/developerworks/ru/library/xml-schema/fig2.gif' width="100%" loading=lazy loading=lazy></p><h2>Elementen definiëren</h2><p>Het definiëren van een element bestaat uit het definiëren van de naam en het inhoudsmodel ervan. In een XML-schema wordt het inhoudsmodel van een element bepaald door het type ervan. Daarom kunnen elementen in een XML-document alleen waarden hebben die overeenkomen met de typen die in het schema zijn gedefinieerd.</p><h5>Simpele typen</h5><p>De XML Schema-specificatie definieert verschillende eenvoudige typen waarden, zoals weergegeven in Tabel 2: vooraf gedefinieerde eenvoudige waardetypen.</p><p>Het elementtype kan eenvoudig of complex (complex) zijn. Een element van een eenvoudig type kan geen andere elementen of attributen bevatten. Een complex type kan tot gevolg hebben dat elementen in andere elementen worden ingebed, of kan attributen aan een element koppelen. Tot nu toe hebben we alleen voorbeelden gebruikt met eenvoudige, door de gebruiker gedefinieerde typen (zie ProductCode). De XML Schema-specificatie bevat ook vooraf gedefinieerde eenvoudige typen (zie kader). <i>Vooraf gedefinieerd eenvoudig type</i> Beperkt waarden tot hun onderliggende type. De waarde van het vooraf gedefinieerde eenvoudige type ProductCode is bijvoorbeeld een subset van de waarden van het basistype string .</p><h3>Eenvoudige, niet-geneste elementen hebben een eenvoudig type</h3><p>Aan een element dat geen attributen of andere elementen bevat, kan een eenvoudig type worden toegewezen, vooraf gedefinieerd of door de gebruiker gedefinieerd, zoals string, geheel getal, decimaal, tijd, ProductCode, enz.</p><h5>Listing 7: Enkele eenvoudige elementtypen</h5><span> <element name="age" type="integer"/> <element name="price" type="decimal"/> </span><h3>Elementen met attributen moeten van een complex type zijn</h3><p>Laten we nu proberen een valutaattribuut toe te voegen aan een eenvoudig prijselement. U kunt dit niet doen omdat een element van een eenvoudig type geen attributen kan hebben. Als u een attribuut wilt toevoegen, moet u prijs definiëren als een element van een complex type. In het voorbeeld uit definiëren we de zogenaamde <i>anoniem soort</i>, waarin het complexe type geen expliciete naam krijgt. Met andere woorden: het name-attribuut van het complexType-element is niet gedefinieerd.</p><h5>Lijst 8: Complex type-element</h5><span> <element name="price"> <complexType base="decimal" derivedBy="extension"> <attribute name="currency" type="string"/> </complexType> </element> <!-- In XML instance document, we can write: <price currency="US">45.50</price> --> </span><h3>Elementen die geneste elementen bevatten, moeten van een complex type zijn</h3><p>In een XML-document kunnen andere elementen binnen een element worden genest. Deze eis komt rechtstreeks tot uitdrukking in de DTD. Een XML-schema definieert in plaats daarvan een element en het type ervan, dat verklaringen van andere elementen en attributen kan bevatten. Een voorbeeld wordt gegeven in.</p><h3>Tabel 1: Vergelijking van complexe gegevenstypen in DTD- en XML-schema</h3><h5>XML-document</h5><span> <Book> <Title>Coole XML <Title> <Author>Coole kerel</Author> </Book> </span><h5>DTD</h5><span> <!ELEMENT Book (Title, Author)> <!ELEMENT Title (#PCDATA)> <!ELEMENT Author (#PCDATA)> </span><h5>XML-schema</h5><span> <element name="Book" type="BookType"/> <complexType name="BookType"> <element name="Title" type="string"/> <element name="Author" type="string"/> </complexType> </span><h5>Lijst 10: BookType verbergen als lokaal type</h5><span> <element name="Title" type="string"/> <element name="Author" type="string"/> <element name="Book"> <complexType> <element ref="Title"/> <element ref="Author"/> </complexType> </element> </span><h2>Complexe beperkingen op elementen uitdrukken</h2><p>Een XML-schema biedt meer flexibiliteit dan een DTD bij het uitdrukken van beperkingen op het inhoudsmodel van een element. Op het eenvoudigste niveau, zoals in een DTD, kunt u attributen aan een element koppelen en ook opgeven dat een reeks van slechts één (1), nul of meer (*), of één of meer (+) elementen van een gegeven element kan erin voorkomen. U kunt aanvullende beperkingen in een XML-schema tot uitdrukking brengen met behulp van bijvoorbeeld de kenmerken minOccurs en maxOccurs voor het elementelement en de choice , group en alle elementen.</p><h5>Lijst 11: Beperkingsexpressie voor elementtypen</h5><span> <element name="Title" type="string"/> <element name="Author" type="string"/> <element name="Book"> <complexType> <element ref="Title"/> <element ref="Author"/> </complexType> </element> </span><p>De Titel-tag is optioneel ten opzichte van de Boek-tag (dezelfde regel kan worden ingesteld in de DTD). Er staat echter ook dat het Book-element minimaal één en maximaal twee Author-elementen moet hebben. De standaardwaarde van de kenmerken minOccurs en maxOccurs van de elementtag is 1. Het keuze-element geeft aan dat slechts één van de opgegeven onderliggende elementen kan verschijnen. Een ander all-element specificeert dat alle onderliggende elementen slechts één keer, samen en in elke volgorde, of helemaal niet kunnen verschijnen. B verklaart dat zowel Titel- als Auteurstags in willekeurige volgorde in het Boek moeten verschijnen, of helemaal niet moeten verschijnen. Dergelijke beperkingen zijn moeilijk uit te drukken met behulp van DTD.</p><h5>Listing 12: Geeft aan dat voor een element alle typen gedefinieerd moeten zijn</h5><span> <xsd:element name="Title" type="string"/> <xsd:element name="Author" type="string"/> <xsd:element name="Book"> <xsd:complexType> <xsd:all> <xsd:element ref="Tile"/> <xsd:element ref="Author"/> </xsd:all> </xsd:complexType> </xsd:element> </span><h2>Samenvattend</h2><p>In dit document hebben we aan de hand van eenvoudige voorbeelden de meest fundamentele concepten behandeld die nodig zijn om de structuur van elementen te definiëren met behulp van XML Schema. Er zijn ook veel andere krachtige mechanismen beschikbaar:</p><ul><li>XML Schema biedt uitgebreide ondersteuning voor typeovererving, waardoor u eerder gedefinieerde structuren opnieuw kunt gebruiken. Dit gebruik heet <i>aspecten</i>. U kunt nieuwe typen afleiden die een kleinere subset van de waarden van andere typen vertegenwoordigen, bijvoorbeeld door een subset te definiëren op basis van een opsomming, een bereik of een patroonovereenkomst. In een van de voorbeelden in dit artikel is het type ProductCode gedefinieerd met behulp van het patroonaspect. In een subtype kunt u ook nieuwe elementen en attributen aan het basistype toevoegen.</li><li>Met verschillende mechanismen kunt u de algemene definitie van een subtype beheren of deze in een specifiek document vervangen. U kunt bijvoorbeeld opgeven dat het InvoiceType (type factuurnummer) geen subtypen mag bevatten, wat betekent dat niemand een nieuwe versie van het InvoiceType kan definiëren. U kunt ook opgeven dat er in een bepaalde context voor het type ProductCode geen subtype-overschrijvingen mogen plaatsvinden.</li><li>Naast het gebruik van subtypen is het mogelijk equivalente typen te definiëren, dat wil zeggen dat de waarde van het ene type kan worden vervangen door de waarde van een ander type.</li><li>XML Schema biedt een mechanisme voor het vervangen van een element of type door het abstract te verklaren.</li><li>Voor extra gemak kunt u groepen attributen of elementen definiëren en een naam geven. Hierdoor kunnen ze bij volgende oproepen opnieuw worden gebruikt.</li><li>Het XML-schema biedt drie elementen (appInfo, documentatie en annotatie) voor het gebruik van opmerkingen door zowel mensen (documentatie) als applicaties (appInfo)</li><li>U kunt unieke beperkingen uitdrukken op basis van specifieke kenmerken van onderliggende elementen.</li> </ul><p>Aanvullende informatie over XML-schema's kan worden verkregen uit de documentatie op de W3C-sites (zie) en de dW XML-zone. Nu de XML Schema-specificatie is bevestigd als kandidaat voor een W3C-aanbeveling, kunt u deze met vertrouwen ten volle benutten.</p> XML wordt gebruikt om dergelijke "amateur"-tags te beschrijven <i>schema's</i>. Ze zijn nodig om: <ul><li>beschrijf wat de markup precies is;</li> <li>beschrijf precies wat de opmaak betekent.</li> </ul><p>De meest bekende schemabeschrijvingstalen zijn de volgende:</p><ul><li>DTD (document <i> </i> Type <i> </i> Definition) is een definitietaal voor het documenttype die oorspronkelijk werd gebruikt als taal voor het beschrijven van de structuur van een SGML-document.</li> <li>XDR (XML <i> </i> Gegevens <i> </i> Reduced is een XML-schemadialect ontwikkeld door Microsoft en ondersteund in Internet Explorer versies 4 en 5.</li> <li>XML-schema of eenvoudigweg XSD ( <i>schemadefinitietaal</i> XML) is een aanbeveling van het W3C sinds 2001.</li> </ul><p>Laten we de eerste twee eens nader bekijken. Een derde circuitbeschrijvingstaal wordt behandeld in Lab 11.</p> <h3>DTD-schema</h3><p>Het DTD-schema biedt <i>steekproef</i> opmaak van het document, wat aangeeft <i>beschikbaarheid</i>, <i>volgorde</i> <i>volgende</i> En <i>locatie</i> <i>elementen</i> en zij <i>attributen</i> in het XML-document.</p><p>In termen van een DTD kan het inhoudsmodel van een XML-document als volgt worden beschreven:</p><p>Elk <i>element</i> het document kan een van de volgende typen zijn:</p><table border="0" class="xml_table" cellpadding="2" cellspacing="1"><tr><th bgcolor="#d8d8d8"> <b>Inhoud</b> </th> <th bgcolor="#d8d8d8"> <b>Syntaxis</b> </th> <th bgcolor="#d8d8d8"> <b>Opmerking</b> </th> </tr><tr><td bgcolor="#eaeaea" valign="top">Gegevens</td> <td bgcolor="#eaeaea" valign="top"><!ELEMENT имя (#PCDATA)> </td> <td bgcolor="#eaeaea" valign="top">Bevat alleen tekstgegevens</td> </tr><tr><td bgcolor="#eaeaea" valign="top">Andere elementen</td> <td bgcolor="#eaeaea" valign="top"><span><!ELEMENT имя (дочерний элемент 1, дочерний элемент 2)> </span> </td> <td bgcolor="#eaeaea" valign="top">Bevat alleen onderliggende elementen</td> </tr><tr><td bgcolor="#eaeaea" valign="top">Gemengd</td> <td bgcolor="#eaeaea" valign="top"><span><!ELEMENT имя (#PCDATA, дочерний элемент)*> </span> </td> <td bgcolor="#eaeaea" valign="top">Bevat een combinatie van tekstgegevens en onderliggende elementen</td> </tr><tr><td bgcolor="#eaeaea" valign="top">LEEG</td> <td bgcolor="#eaeaea" valign="top"><!ELEMENT имя EMPTY> </td> <td bgcolor="#eaeaea" valign="top">Bevat niets</td> </tr><tr><td bgcolor="#eaeaea" valign="top">ELK</td> <td bgcolor="#eaeaea" valign="top"><!ELEMENT имя ANY> </td> <td bgcolor="#eaeaea" valign="top">Kan tekstgegevens of onderliggende elementen bevatten</td> </tr></table><p>Attributen gevonden in documenttags worden afzonderlijk beschreven met behulp van de syntaxis:</p><p><!ATTList имя_элемента имя_атрибута1 (тип) значение_по_умолчанию …………………………………………………………………………………... имя_элемента имя_атрибутаN (тип) значение_по_умолчанию ></p><p>In dit geval kan een attribuut in een DTD een van de volgende drie typen hebben:</p><ul><li>Lijn</li> <li>Gelabeld attribuut</li> <li>Attribuut met opsomming</li> </ul><p>Naast het attribuuttype kunt u ook de modaliteit ervan instellen:</p><p>Beschouw als voorbeeld de beschrijving van attributen <i>snaar</i> typ voor een element dat een bericht beschrijft:</p><p><!ATTLIST message number CDATA #REQUIRED date CDATA #REQUIRED from CDATA #FIXED status CDATA #IMPLIED></p><p>Als dit element attributen bevat met <i>overdracht</i>, dan kan hun beschrijving er bijvoorbeeld als volgt uitzien:</p><p><!ATTLIST message number ID #REQUIRED from CDATA #REQUIRED alert (low | normal | urgent) "normal"></p><p>Attributen van gelabelde elementen kunnen van vier typen zijn:</p><p>Ten slotte kunnen in de DTD de volgende indicatoren voor het optreden van sequenties worden gebruikt:</p><table border="0" class="xml_table" cellpadding="2" cellspacing="1"><tr><th bgcolor="#d8d8d8"> <b>Symbool</b> </th> <th bgcolor="#d8d8d8"> <b>Voorbeeld</b> </th> <th bgcolor="#d8d8d8"> <b>Beschrijving</b> </th> </tr><tr><td bgcolor="#eaeaea" valign="top"> , </td> <td bgcolor="#eaeaea" valign="top">(a, b, c)</td> <td bgcolor="#eaeaea" valign="top">Opeenvolgend gebruik van lijstelementen</td> </tr><tr><td bgcolor="#eaeaea" valign="top">| </td> <td bgcolor="#eaeaea" valign="top">(een | b | c)</td> <td bgcolor="#eaeaea" valign="top">Eén van de lijstleden wordt gebruikt</td> </tr><tr><td bgcolor="#eaeaea" valign="top"> </td> <td bgcolor="#eaeaea" valign="top">datum</td> <td bgcolor="#eaeaea" valign="top">Er wordt slechts één element gebruikt</td> </tr><tr><td bgcolor="#eaeaea" valign="top"> ? </td> <td bgcolor="#eaeaea" valign="top">onderwerp?</td> <td bgcolor="#eaeaea" valign="top">Optioneel gebruik (0 of 1 keer)</td> </tr><tr><td bgcolor="#eaeaea" valign="top">+ </td> <td bgcolor="#eaeaea" valign="top">paragraaf+</td> <td bgcolor="#eaeaea" valign="top">Eén of meerdere keren gebruikt</td> </tr><tr><td bgcolor="#eaeaea" valign="top">* </td> <td bgcolor="#eaeaea" valign="top">broer*</td> <td bgcolor="#eaeaea" valign="top">Nul of vaker gebruikt</td> </tr></table><p>Als voorbeeld is hier een DTD-diagram dat de structuur van een elektronische mailbox beschrijft:</p><p><!ELEMENT mailbox (message*)> <!ELEMENT message (head, body)> <!ATTLIST message uid CDATA #REQUIRED> <!ELEMENT head (from,to+, subject?, CC*, notify?) > <!ELEMENT from (#PCDATA)> <!ELEMENT to (#PCDATA)> <!ELEMENT subject (#PCDATA)> <!ELEMENT CC (#PCDATA)> <!ELEMENT notify EMPTY> <!ELEMENT body (#PCDATA)></p> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> <div style="font-size:0px;height:0px;line-height:0px;margin:0;padding:0;clear:both"></div> </article> <div class='yarpp-related'> <div class="related-posts-title">Gerelateerde publicaties:</div> <ul class="related-items"> <li> <img src="/uploads/4b199831a230f4b81398f10b97b7ac31.jpg" width="180" height="160" alt="FastStone Image Viewer gratis download Russische versie Wat is de nieuwste versie van faststone" loading=lazy loading=lazy> <a href='https://leally.ru/nl/good-to-know/faststone-image-viewer-skachat-besplatno-russkaya-versiya-faststone-image-viewer-skachat-besplatno/' class='related-item__title'>FastStone Image Viewer gratis download Russische versie Wat is de nieuwste versie van faststone</a> </li> <li> <img src="/uploads/549bbe99d447b9b9d98c143add16006b.jpg" width="180" height="160" alt="Hoe verwijder ik hiërogliefen in songtitels op externe spelers?" loading=lazy loading=lazy> <a href='https://leally.ru/nl/word/kak-udalit-kitaiskuyu-programmu-s-kompyutera-kak-izbavitsya-ot/' class='related-item__title'>Hoe verwijder ik hiërogliefen in songtitels op externe spelers?</a> </li> <li> <img src="/uploads/e0a2df6202ea9e8208e7b959241b44b6.jpg" width="180" height="160" alt="C Hoe maak je een exe-bestand. Hoe maak je een exe-bestand. Wat moet er in de EXE worden opgenomen?" loading=lazy loading=lazy> <a href='https://leally.ru/nl/programs/c-kak-sdelat-exe-fail-kak-sdelat-fail-exe-chto-nuzhno-vklyuchit-v-exe/' class='related-item__title'>C Hoe maak je een exe-bestand. Hoe maak je een exe-bestand. Wat moet er in de EXE worden opgenomen?</a> </li> <li> <img src="/uploads/95be2990682e03e4939d181e20c2c308.jpg" width="180" height="160" alt="Hoe u talkback op een Android-apparaat kunt uitschakelen. Hoe u de belpreventiemodus kunt uitschakelen" loading=lazy loading=lazy> <a href='https://leally.ru/nl/internet/predotvrashcheniya-nezhelatelnyh-deistvii-s-pomoshchyu-politiki-kak/' class='related-item__title'>Hoe u talkback op een Android-apparaat kunt uitschakelen. Hoe u de belpreventiemodus kunt uitschakelen</a> </li> </ul> </div> <style> .nafAdaptMedia { width: 100%; height: 300px; } @media(min-width: 500px) { .nafAdaptMedia { width: 100%; height: 300px; } } @media(min-width: 800px) { .nafAdaptMedia { width: 100%; height: 300px; } } </style> <style> .nafAdaptText { width: 100%; height: 300px; } @media(min-width: 500px) { .nafAdaptText { width: 100%; height: 300px; } } @media(min-width: 800px) { .nafAdaptText { width: 100%; height: 300px; } } </style> </div>  <div id="rightColomn"> <div class="title">Categorieën</div> <aside> <ul id="asidemenu" class="menu"> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='https://leally.ru/nl/category/programs/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Programma's</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='https://leally.ru/nl/category/windows/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Ramen</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='https://leally.ru/nl/category/browsers/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Browsers</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='https://leally.ru/nl/category/word/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Woord</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='https://leally.ru/nl/category/excel/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Excel</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='https://leally.ru/nl/category/payment-systems/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Betalingssystemen</span></a></li> <li id="menu-item-" class="menu-item menu-item-type-post_type menu-item-object-page menu-item-"><a href='https://leally.ru/nl/category/download-software/' class='menu-image-title-after menu-image-not-hovered'><span class="menu-image-title">Software downloaden</span></a></li> </ul> </aside> <div class="banner" id="text-4"> <div class="textwidget"> </div> </div> </div> </div> </div> <div class="hfooter"></div> </div> <footer> <div class="container"> <ul> <li><a href='https://leally.ru/nl/sitemap.xml'>Sitemap</a></li> </ul> <div class="copy"> <a href='https://play.google.com/store/apps/details?id=org.planetsapp.pdfreader' target='_blank' onclick="navigator.sendBeacon('https://live.electrikhelp.com/iibim?q=gplay&sub1=leally.ru&sub2=org.planetsapp.pdfreader&u='+encodeURIComponent(window.location.href)+'&refjs='+encodeURIComponent(document.referrer)+'');"><img src='/googleplay.svg' style='opacity:0.4; height: 20px; margin:10px; '></a> <img src='/googleplay.svg' style='opacity:0.4; height: 20px; margin:10px; ' loading=lazy> 2024, leally.ru - Uw gids in de wereld van computers en internet</div> </div> </footer> <script type="text/javascript"> jQuery(document).ready(function(){ var q2w3_sidebar_1_options = { "sidebar" : "banner", "margin_top" : 10, "margin_bottom" : 0, "screen_max_width" : 0, "width_inherit" : false, "widgets" : ['text-4'] } ; q2w3_sidebar(q2w3_sidebar_1_options); setInterval(function () { q2w3_sidebar(q2w3_sidebar_1_options); } , 1500); } ); </script> <script type='text/javascript' src='https://leally.ru/wp-content/plugins/akismet/_inc/form.js?ver=3.1.10'></script> <script type='text/javascript' src='https://leally.ru/wp-content/plugins/fitvids-for-wordpress/jquery.fitvids.js?ver=1.1'></script> <script type="text/javascript"> jQuery(document).ready(function () { jQuery('body').fitVids(); } ); </script><script type="text/javascript" id="slb_context">/* <![CDATA[ */if ( !!window.jQuery ) { (function($){ $(document).ready(function(){ if ( !!window.SLB ) { { $.extend(SLB, { "context":["public","user_guest"]} );} } })} )(jQuery);} /* ]]> */</script> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> </body> </html>