Dtd este interzisă de registrul rus. Limbajul XML - Documents Type Definitions (DTD). Ce este un DTD în XML și de ce este necesar?

04.11.2020 Știri

În documentele XML, un DTD definește un set de elemente valide, identifică elemente care pot fi conținute în alte elemente și definește atribute valide pentru fiecare dintre ele. Sintaxa DTD-urilor este foarte unică și necesită efort suplimentar din partea autorului-dezvoltator la crearea unor astfel de documente (complexitatea DTD-urilor este unul dintre motivele pentru care utilizarea SGML, care necesită definirea unui DTD pentru orice document, nu a devenit la fel de răspândită. cum ar fi, de exemplu, HTML). După cum s-a menționat, nu este necesară utilizarea DTD-urilor în XML - documentele create fără aceste reguli vor fi procesate corect de parser dacă îndeplinesc cerințele de bază ale sintaxei XML. Cu toate acestea, controlul asupra tipurilor de elemente și corectitudinea relațiilor dintre ele în acest caz va reveni în întregime autorului documentului. Până când va fi descrisă gramatica noului nostru limbaj, doar noi îl vom putea folosi, iar pentru aceasta vom fi obligați să folosim software special dezvoltat, și nu programe universale de analiză.

DTD pentru XML utilizează următoarele tipuri de reguli: reguli pentru elemente și atributele acestora, descrieri ale categoriilor (definiții macro), descrieri ale formatelor de date binare. Toate descriu constructele de bază ale limbajului - elemente, atribute, constante simbolice, fișiere externe de date binare.

Pentru a utiliza un DTD în documentul nostru, îl putem descrie fie în fișier extern iar când descrieți DTD-ul, pur și simplu indicați un link către acest fișier sau, direct în documentul propriu-zis, selectați o zonă în care să definiți regulile necesare. În primul caz, documentul specifică numele fișierului care conține descrieri DTD:

...

În document, declarațiile DTD sunt incluse după cum urmează:

... ... ]> ...

În cazul în care descrierile interne și externe sunt utilizate simultan, programul analizorului le va lua în considerare mai întâi pe cele interne, i.e. prioritatea lor este mai mare. Când validează un document, procesorul XML caută mai întâi DTD-ul în document. Dacă regulile din interiorul documentului nu sunt definite și atributul nu este setat standalone="da", apoi programul va încărca fișierul extern specificat și regulile conținute în acesta vor fi citite de acolo. Dacă atributul de sine stătătoare are sensul "da„, atunci utilizarea descrierilor DTD externe va fi interzisă.

Definiția elementului

Un element dintr-un DTD este definit de un mâner! ELEMENT, care specifică numele elementului și structura conținutului acestuia.

De exemplu, pentru un element se poate defini următoarea regulă:

Cuvântul cheie ELEMENT indică faptul că această declarație va descrie un element XML. În cadrul acestei instrucțiuni sunt specificate numele elementului (floare) și tipul conținutului acestuia.

În definirea unui element, mai întâi specificăm numele elementului (floare), apoi modelul de conținut al acestuia - determinăm ce alte elemente sau tipuri de date pot apărea în cadrul acestuia. În acest caz, conținutul elementului floare va fi determinat folosind un marker special PCDATA (ceea ce înseamnă date de caractere analizabile - orice informație cu care poate lucra programul de analiză). Mai sunt două declarații care definesc tipul de conținut: EMPTY, ANY. Primul indică faptul că elementul ar trebui să fie gol (de exemplu, ), al doilea este că conținutul elementului nu este descris în mod specific.

Secvența de obiecte copil pentru elementul curent este specificată ca o listă de nume de elemente separate prin virgulă. În acest caz, pentru a indica numărul de repetări ale incluziunilor acestor elemente, simbolurile +, *, ? :

Acest exemplu specifică că în interiorul unui element trebuie definite elementele titlul, autorul și cuprinsul, elementul titlu fiind element obligatoriuși poate apărea o singură dată, elementul autor poate apărea de mai multe ori, iar elementul de cuprins este opțional, adică. poate lipsi. Dacă există mai multe opțiuni posibile pentru conținutul unui element definit, acestea ar trebui separate folosind simbolul „|”. :

* din acest exemplu indică faptul că secvența elementelor interne care este definită poate fi repetată de mai multe ori sau să nu fie folosită deloc.

Dacă definiția elementului specifică conținut „mixt”, i.e. date text sau un set de elemente, trebuie mai întâi să specificați PCDATA și apoi separate prin „|” lista de elemente.

Exemplu de document XML valid:

]> ...

bulevardul Marks
12-12-12 46-23-62 [email protected]

Atribute definitorii

Listele de atribute ale elementelor sunt definite folosind un cuvânt cheie! ATTLIST. În interiorul acestuia, sunt specificate numele atributelor, tipurile de valori ale acestora și parametrii suplimentari. De exemplu, pentru un element

Pot fi definite următoarele atribute:

ÎN în acest exemplu pentru element articol sunt definite trei atribute: id, despreȘi tip, care au tipurile ID (identificator), CDATA și respectiv listă de valori posibile. Există un total de șase tipuri posibile de valori de atribut:

  • CDATA - conținutul documentului poate fi orice tip de date
  • ID - definește identificatorul unic al elementului din document
  • IDREF(IDREFS) - indică faptul că valoarea atributului ar trebui să fie numele (sau mai multe astfel de nume, separate prin spații în al doilea caz) al identificatorului unic al elementului definit în acest document
  • ENTITATE(ENTITATI) - valoarea atributului trebuie sa fie numele (sau lista de nume daca se foloseste ENTITATI) componentei (definitie macro) definita in document
  • NMTOKEN (NMTOKENS) - conținutul elementului poate fi doar un singur cuvânt (adică acest parametru este o variantă limitată a CDATA)
  • Lista de valori valide - definită lista de valori, pe care acest atribut îl poate avea.

De asemenea, puteți utiliza următorii parametri într-o definiție de atribut:

  • #NECESAR - definește un atribut obligatoriu care trebuie setat pe toate elementele de acest tip
  • #IMPLIED - atributul este opțional
  • #FIXED „valoare” - indică faptul că atributul trebuie să aibă doar valoarea specificată, cu toate acestea, definiția atributului în sine nu este obligatorie, dar în timpul procesului de analizare valoarea acestuia va fi în orice caz transmisă programului de analiză
  • Valoare - setează valoarea implicită a atributului

Definirea componentelor (definiții macro)

O entitate reprezintă definiții al căror conținut poate fi reutilizat într-un document. În alte limbaje de programare, elemente similare sunt numite macrodefiniții. Componentele DTD sunt create folosind instrucțiunea!ENTITY:

Programul analizor, analizând în primul rând conținutul zonei de definire a DTD, va procesa această instrucțiune și, în timpul analizei ulterioare a documentului, va folosi conținutul componentei DTD în locul în care apare numele acesteia. Acestea. Acum în document putem folosi expresia, care va fi înlocuită cu linia „Suntem bucuroși să vă salutăm”

În general, trei tipuri de definiții macro pot fi definite într-un DTD:

Definiții macro interne- sunt concepute pentru a defini o constantă șir; cu ajutorul lor, puteți organiza link-uri către informații modificate frecvent, făcând documentul mai lizibil. Componentele interne sunt incluse în document folosind ampersand &

Există cinci constante de caractere interne predefinite în XML:

  • < - символ "<"
  • > - simbolul „>”
  • & - simbolul „&”
  • " - simbol apostrof """
  • " - caracterul ghilimele duble """

Definiții macro externe- indică conținutul unui fișier extern, iar acest conținut poate fi text sau date binare. În primul caz, în care este utilizată macro-ul va fi inserată șiruri de text, în a doua - date binare care nu sunt luate în considerare de analizor și sunt utilizate de programe externe

Definiții Macro reguli- definițiile macro parametrilor pot fi utilizate numai în zona DTD și sunt indicate printr-un simbol % special inserat înaintea numelui macro. În acest caz, conținutul componentei va fi plasat direct în textul regulii DTD

De exemplu, pentru următorul fragment de document:

Puteți folosi o formă mai scurtă:

Macro-urile sunt adesea folosite pentru a descrie parametrii din regulile de atribute. În acest caz, devine posibil să folosiți aceleași definiții de atribute pentru diferite elemente:

Tastarea datelor

Destul de des, atunci când creează un element XML, dezvoltatorul trebuie să determine ce tip de date pot fi folosite ca conținut. Acestea. dacă definim un element 10.10.98, atunci vrem să fim siguri că în documentul din acest loc va exista un șir reprezentând o dată, și nu un număr sau o secvență arbitrară de caractere. Folosind tastarea datelor, puteți crea elemente ale căror valori pot fi utilizate, de exemplu, ca parametri în interogările SQL. În acest caz, programul client trebuie să știe ce tip de date îi aparține valoarea elementului curent și, dacă se potrivește, generează o interogare SQL.

Dacă un procesor XML de verificare este utilizat ca program la nivelul clientului, atunci informațiile despre tip pot fi transmise folosind un element special creat pentru acest atribut care are o definiție DTD corespunzătoare. În timpul procesului de analizare, analizatorul va transmite valoarea acestui atribut aplicației client, care poate folosi aceste informații așa cum se așteaptă. De exemplu, pentru a specifica faptul că conținutul unui element trebuie să fie un întreg lung, puteți utiliza următoarea definiție DTD:

Setând atributul la valoarea implicită LONG și definindu-l ca FIX, am permis programului client să obțină informațiile necesare despre tipul de conținut a acestui element, iar acum poate determina independent dacă tipul de conținut se potrivește cu cel specificat în definiția DTD.

Iată un exemplu de document XML care definește și utilizează mai multe elemente cu diferite tipuri de date:

... 5 2 32.5 Adevărat 18346 34 frecați. 28 k. ...

După cum se poate observa din exemplu, mecanismul de creare a elementelor documentului nu s-a schimbat deloc. Toate informațiile necesare pentru verificarea tipurilor de date sunt incluse în definițiile elementelor din blocul DTD.

În concluzie, aș dori să observ că DTD ne oferă un mecanism foarte convenabil pentru controlul conținutului unui document. Astăzi, aproape toate programele de vizualizare a documentelor de pe Internet folosesc reguli DTD. Cu toate acestea, aceasta este departe de a fi singura modalitate de a verifica corectitudinea unui document. În prezent, este luat în considerare de către consorțiul W3 nou standard limbaj pentru descrierea structurii documentelor, numit scheme de date. Următoarea secțiune este dedicată lucrului cu ei.

3

Încerc să deschid un fișier XML în Excel 2013, dar spune că nu o poate face, deoarece „DTD nu este permis”. Căutam o soluție, dar tot ce am găsit au fost niște fragmente de cod care ar trebui să rezolve problema.

Dar nu înțeleg asta! Ce cod? Doar deschid un fișier, nu scriu un program sau altceva. Ar trebui să citesc acest cod cu voce tare înainte de a deschide fișierul sau ce? Îmi pare rău, dar mi se pare cu adevărat absurd.

Există vreo soluție pentru a deschide fișierul fără a scrie un program pentru el? Și dacă nu, ce ar trebui să fac cu acest cod?

cod vorbesc despre următoarele

Set xmlDoc = CreateObject("Msxml2.DOMDocument.6.0") xmlDoc.setProperty "ProhibitDTD",False xmlDoc.load xmltoload.xml

Am descoperit că fișierul ar trebui să fie deschis în Word, nu Excel, dar Word 2013 îmi dă aceeași eroare.

Răspuns:
Se pare că fișierul trebuia deschis în Excel până la urmă. Am descoperit online că Office 2007 și mai vechi nu interzic DTD, oricare ar fi acesta. Așa că am ocolit cu succes problema deschizând fișierul necesar în Excel 2003.

  • 3 raspunsuri
  • Triere:

    Activitate

1

Toate documente XML se bazează pe determinarea ce câmpuri au permisiunea de a exista și ce valori pot exista în fiecare dintre acele câmpuri. Acestea sunt definite în fiecare fișier XML prin referire la o definiție a tipului de document ("DTD") sau fișier XML-sistem.

Înțeleg că Excel 2007 și versiunile ulterioare NU acceptă DTD-uri. În schimb, se așteaptă ca fișierul dvs. XML să facă referire la o schemă XML.

Prin urmare, problema principală este că fișierul dvs. XML face referire la un fișier DTD și trebuie să vă convertiți fișierul DTD într-un fișier XML Schema (puteți verifica acest lucru deschizând documentul cu un program precum Notepad++ și priviți textul brut.)

Există multe instrumente care vă vor ajuta să faceți acest lucru, dar, să fiu sincer, am încercat să le fac pe toate să funcționeze de ore întregi și încă nu am Excel să-mi deschidă XML-ul (a trecut prin această postare în timp ce căutam pe google același cod de eroare. )

Dacă încercați doar să deschideți un fișier XML o dată, probabil că nu doriți să depuneți mult efort în el, dar dacă găsesc o soluție rapidă și ușoară. acestea.

Dacă trebuie doar să-l deschideți, există program gratuit, care poate fi descărcat, care convertește XML în CSV:

L-am încercat și a funcționat grozav - am făcut ca fișierul meu să se deschidă imediat în Excel 2013. Pe acest moment problema rezolvata.

Desigur, scopul XML este că datele se pot raporta la alte date cu context și se pot pierde fără o schemă adecvată sau un fișier DTD. Dar dacă doriți doar să se deschidă fișierul, acest lucru ar trebui să funcționeze pentru moment (pentru cei care nu au încă Excel 2003, deși cred că este la fel de ușor pentru dvs.).

Acesta este următorul articol din seria „XML Basics” și în el ne vom uita la elementele de bază ale descrierii structurii date XML folosind DTD. Acesta este un mod destul de vechi de a descrie structura documentelor XML, dar este încă folosit, așa că ne vom uita în continuare la el.

De asemenea, aș dori să subliniez că aceasta este o modalitate excelentă de a arăta cum XML verifică conținutul documentului, gramatica etc. Ne vom uita la un mod mai nou și mai avansat de a descrie structura documentelor XML folosind tehnologia XML Schema în articolul următor, dar deocamdată să trecem direct la studiul DTD XML.

În acest articol ne vom uita la câteva Puncte importante. Iată ce este un DTD XML și pentru ce este necesar, să vorbim despre dezavantajele DTD și, de asemenea, să învățăm cum să compuneți în mod independent propriul DTD pentru validarea documentelor XML. Toate acestea, ca de obicei, vor fi prezentate pas cu pas, cât mai scurt și clar posibil pentru a vă economisi timp.

Deci, să începem.

Ce este un DTD în XML și de ce este necesar?

Pe scurt, un DTD în XML este folosit pentru a verifica gramatica unui document și conformitatea acestuia cu un standard (unul pe care dezvoltatorul sau tu l-ai inventat). Acest lucru permite parserului (procesorului) să determine în etapa de procesare dacă documentul îndeplinește cerințele noastre. Adică, documentul XML este validat.

Necesitatea verificării gramaticii documentelor XML este următoarea:

  • Este posibil ca documentul XML să nu fie destinat sistemului dumneavoastră.
  • Documentul XML poate conține date incorecte.
  • Documentul XML poate conține erori în structură ().

Deci, ne-am dat seama ce este un DTD XML și de ce este necesar. Acum să ne uităm pe scurt la dezavantajele DTD-urilor și apoi să trecem la procesul de creare a fișierelor DTD pentru validarea documentelor XML.

Dezavantajele XML DTD

  • Sintaxa limbajului diferită de XML. Acest lucru cauzează multe probleme, cum ar fi probleme de codificare sau incapacitatea de a urmări erorile.
  • Nu se verifică tipul de date. Există un singur tip în DTD - șir.
  • Nu există DTD. Nu puteți potrivi două sau mai multe descrieri DTD unui document.

Era lista finaliștilor Deficiențe DTD, care au fost corectate cu succes în scheme XML, despre care vom vorbi în articolele următoare.

Declararea elementelor, atributelor și entităților într-o DTD. Modificatori „*”, „?”, „+”

Declarațiile și modificatorii speciali sunt utilizați pentru a declara elemente, atribute și entități într-un DTD. Pentru a înțelege totul în detaliu, să ne uităm mai întâi la informațiile teoretice, iar apoi în a doua parte a articolului vom trece la exemple practice.

Definirea unui element XML și a unei secvențe de elemente XML

Elementul carte conține un titlu, autor, preț și elemente de descriere.

Elemente alternative

Elementul listă de prețuri conține elementele titlul, prețul și unul dintre cele trei elemente din care puteți alege – autor, companie sau eșantion.

Elemente goale

Elementul none trebuie să fie gol.

Declarație de atribut

Elementul listă de prețuri poate conține două atribute - un atribut id și un atribut nume. În acest caz, atributul id este necesar, deoarece este specificat #REQUIRED, iar atributul name este opțional (este specificat #IMPLIED). La rândul său, CDATA indică handler-ului că nu este nevoie să analizeze conținutul atributelor.

Definirea Entităților

Dacă se întâlnește entitatea „”, atunci „Dmitry Denisov” va fi înlocuit automat.

Modificatori (explica repetițiile elementelor)

* - zero sau multe.
? – zero sau unu.
+ - unul sau mai multe.

Elementul cărți poate conține unul sau mai multe elemente de carte.

Acum să ne uităm la cum arată toate acestea cu exemple mai practice.

Crearea unui fișier DTD pentru validarea unui document XML folosind exemplul unei liste de prețuri de carte

Să avem aceeași listă de prețuri de cărți pe care o folosim pentru exemple în aproape fiecare articol despre XML. Documentul XML în sine va arăta cam așa.

Cartea 1 &myname; Pretul 1 Descriere

Desigur, exemplul de mai sus nu este visul suprem, dar va fi un exemplu. După cum puteți vedea din exemplu, avem o listă de prețuri pentru elemente rădăcină, care conține elemente de carte imbricate. În interiorul elementelor cărții există elemente de titlu, autor, preț și eventual descriere, care pot conține unele date text.

Pentru a valida această listă de prețuri, putem folosi următorul document DTD.

Acum să privim totul mai detaliat.

  • — declarăm cărțile elementului rădăcină și indicăm între paranteze ce poate conține. În acest caz, poate conține unul sau mai multe elemente de carte (semnul plus înseamnă unul sau mai multe, vezi mai sus).
  • — definiți elementul carte. Elementul carte poate conține un element de titlu, unul sau mai multe elemente de autor (semnul plus), un element de preț și unul sau niciun element de descriere (semn de întrebare).
  • — definiți elementul titlu. Specificăm #PCDATA ca conținut al elementului. Aceasta înseamnă că parser-ul trebuie să analizeze ceea ce este în interiorul acestui element.
  • În mod similar, definim elementele autor, preț, descriere.
  • — definim esența. Mai întâi scriem entitatea în sine, iar apoi între ghilimele ce va fi afișat în locul ei. În mod implicit, în XML sunt definite doar 3 entități. Aceasta este mai mult (">" -<), меньше («<» — >) și ampersand („&” - &). Dacă doriți, puteți crea un număr nelimitat de entități folosind această metodă. Semnificațiile pot fi nu numai cuvinte, ci și propoziții întregi de lungime semnificativă.
Conectarea DTD pentru validarea documentelor XML

Metoda declarativă

Această metodă este foarte rar folosită, deoarece esența ei este crearea de documente autosuficiente. Adică, documentul va conține imediat atât DTD, cât și XML. Următorul construct este folosit pentru a adăuga un DTD la XML.

unde în loc de DOCUMENT indicăm elementul rădăcină al documentului XML.

Pentru claritate, să ne uităm la un exemplu de document auto-suficient gata făcut cu o modalitate declarativă de a include un DTD.

]>

Definiție DTD externă - conectarea unui document DTD

Esenta aceasta metoda este de a conecta un fișier DTD la un document XML folosind următorul construct.

unde DOCUMENT – indicăm elementul rădăcină al documentului XML.
file.dtd – link către fișierul DTD.

Pentru claritate, luați în considerare următorul exemplu.

document XML

Aceasta încheie acest articol. Am analizat toate punctele principale atunci când lucram cu XML DTD și, sper, am putut să explic totul clar. Dacă nu doriți să pierdeți alte tutoriale XML și XSLT, vă recomand să vă abonați la newsletter folosind formularul de mai jos.

Asta e tot. Mult succes și succes în învățarea XML!