Qual è la differenza tra XML Schema e DTD?

Ho cercato su google questa domanda, ma non capisco chiaramente cos’è uno schema XML e DTD (definizione del tipo di documento), e perché lo schema XML è più potente rispetto a DTD.

Qualsiasi guida sarebbe molto apprezzata.

Dalla sezione Differenze tra DTD e Schema della conversione di un DTD in un articolo dello schema :

La differenza fondamentale tra DTD e XML Schema è che lo schema XML utilizza una syntax basata su XML, mentre i DTD hanno una syntax unica tenuta da DTD SGML. Sebbene i DTD siano spesso criticati a causa di questa necessità di imparare una nuova syntax, la syntax stessa è piuttosto concisa. L’opposto è vero per XML Schema, che è prolisso, ma fa anche uso di tag e XML in modo che gli autori di XML trovino la syntax di XML Schema meno intimidatoria.

L’objective dei DTD era mantenere un livello di compatibilità con SGML per le applicazioni che potrebbero voler convertire i DTD SGML in DTD XML. Tuttavia, in linea con uno degli obiettivi dell’XML, la “tenacia nella marcatura XML è di importanza minima”, non vi è alcuna preoccupazione reale nel mantenere la sintesi sintattica.

[…]

Quindi quali sono alcune delle altre differenze che potrebbero essere particolarmente importanti quando stiamo convertendo un DTD? Diamo un’occhiata.

Digitando

La differenza più significativa tra DTD e XML Schema è la capacità di creare e utilizzare i tipi di dati in Schema insieme alle dichiarazioni di elementi e attributi. In effetti, è una differenza così importante che metà della raccomandazione dello schema XML è dedicata alla datatyping e allo schema XML. Copriamo dettagliatamente i tipi di dati nella parte III di questo libro, “XML Schema Datatypes.”

[…]

Vincoli di occorrenza

Un’altra area in cui DTD e Schema differiscono in modo significativo è quella relativa ai vincoli di occorrenza. Se richiamate dai nostri esempi precedenti nel Capitolo 2, “Struttura dello schema” (o il vostro lavoro con DTD), ci sono tre simboli che potete usare per limitare il numero di occorrenze di un elemento: *, + e?.

[…]

enumerazioni

Quindi, diciamo che avevamo un elemento e volevamo essere in grado di definire un attributo di dimensione per la maglietta, che permettesse agli utenti di scegliere una taglia: piccola, media o grande. Il nostro DTD sarebbe simile a questo:

< !ELEMENT item (shirt)> < !ELEMENT shirt (#PCDATA)> < !ATTLIST shirt size_value (small | medium | large)> 

[…]

E se volessimo che la size fosse un elemento? Non possiamo farlo con un DTD. Le DTD non forniscono enumerazioni nel contenuto testuale di un elemento. Tuttavia, a causa dei tipi di dati con Schema, quando abbiamo dichiarato l’enumerazione nell’esempio precedente, abbiamo effettivamente creato un simpleType chiamato size_values che ora possiamo utilizzare con un elemento:

  

[…]

Le differenze tra una definizione dello schema XML (XSD) e la definizione del tipo di documento (DTD) includono:

  • Gli schemi XML sono scritti in XML mentre i DTD derivano dalla syntax SGML.
  • Gli schemi XML definiscono i tipi di dati per elementi e attributi mentre DTD non supporta i tipi di dati.
  • Gli schemi XML consentono il supporto per gli spazi dei nomi mentre DTD no.
  • Gli schemi XML definiscono il numero e l’ordine degli elementi figli, mentre DTD no.
  • Gli schemi XML possono essere manipolati da soli con DOM XML ma non è ansible in caso di DTD.
  • utilizzando lo schema XML, l’utente non deve imparare una nuova lingua, ma lavorare con DTD è difficile per un utente.
  • Lo schema XML fornisce una comunicazione sicura dei dati, ovvero il mittente può descrivere i dati in un modo comprensibile dal ricevente, ma in caso di dati DTD può essere frainteso dal ricevitore.
  • Gli schemi XML sono estendibili mentre DTD non è estensibile.

AGGIORNAMENTO : 2015.08.26

Non tutti questi punti elenco sono accurati al 100%, ma ottieni il succo.

D’altra parte:

  • DTD ti consente di definire nuovi valori ENTITY da utilizzare nel tuo file XML.
  • DTD ti consente di estenderlo localmente a un singolo file XML.

DTD precede l’XML e quindi non è XML valido. Questa è probabilmente la più grande ragione per l’invenzione di XSD.

Come molte persone hanno menzionato prima, lo schema XML utilizza una syntax basata su XML e DTD hanno una syntax unica. DTD non supporta i tipi di dati, che importa.

Vediamo un esempio molto semplice in cui l’università ha più studenti e ogni studente ha due elementi “nome” e “anno”. Si noti che ho usato “// ->” nel mio codice solo per i commenti.

inserisci la descrizione dell'immagine qui

Ora scriverò questo esempio sia in DTD che in XSD.

DTD

 < ?xml version="1.0" encoding="UTF-8"?> < !DOCTYPE university[ // --> university as root element < !ELEMENT university (student*)> // --> university has * = Multiple students < !ELEMENT student (name,year)> // --> Student has elements name and year < !ELEMENT name (#PCDATA)> // --> name as Parsed character data < !ELEMENT year (#PCDATA)> // --> year as Parsed character data ]>    John Niel //---> I can also use an Integer,not good   2000 //---> I can also use a string,not good    

XML Schema Definition (XSD)

 < ?xml version="1.0" encoding="UTF-8"?>   //--> complex datatype uniType   //--> has unbounded no.of students    //--> complex datatype stuType   //--> has element name  //--> has element year    //--> university of type UniType  //--> student of type stuType  //--> name of datatype string  //--> year of datatype integer  < ?xml version="1.0" encoding="UTF-8"?>    John Niel   2000 //--> only an Integer value is allowed    

Somiglianze tra XSD e DTD

 both specify elements, attributes, nesting, ordering, #occurences 

Differenze tra XSD e DTD

 XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD 

Inoltre, sebbene XSD sia poco dettagliato, la sua syntax è l’estensione di XML, che rende conveniente imparare velocemente.

Una differenza è anche che in un DTD, il modello di contenuto di un elemento è completamente determinato dal suo nome, indipendentemente da dove appare nel documento. Quindi, diciamo che vuoi avere un elemento figlio name dell’elemento person che ha elementi figlio per first e last . Quindi se si desidera avere un elemento figlio name per un elemento city nello stesso documento, anche questo dovrebbe avere gli elementi figlio first e last . Al contrario, lo schema XML consente di dichiarare i tipi di elemento figlio localmente, quindi in questo caso è ansible dichiarare separatamente gli elementi figlio name sia per la person che per la city , fornendo loro i propri modelli di contenuto appropriati in tali contesti.

L’altra grande differenza è il supporto per gli spazi dei nomi. Poiché i DTD fanno parte delle specifiche XML originali (ed ereditati da SGML), non sono affatto compatibili con lo spazio dei nomi perché in seguito sono stati specificati gli spazi dei nomi XML. È ansible utilizzare DTD in combinazione con spazi dei nomi, ma richiede alcune contorsioni, come essere costretti a definire i prefissi nella DTD e utilizzare solo quei prefissi, invece di essere in grado di utilizzare prefissi arbitrari.

Per me, le altre differenze sono per lo più superficiali. Il supporto dei tipi di dati può essere facilmente aggiunto ai DTD e la syntax è solo syntax. (Io, per esempio, trovo la syntax dello schema XML orribile e non vorrei mai mantenere manualmente uno schema XML, che non direi di DTD o schemi RELAX NG, se per qualche motivo ho bisogno di uno schema XML, di solito scrivo un RELAX NG e convertirlo con trang .)

Somiglianze

DTD e Schemi svolgono entrambe le stesse funzioni di base:

  • Innanzitutto, entrambi dichiarano una lista di articoli e attributi.
  • In secondo luogo, entrambi descrivono come questi elementi sono raggruppati, nidificati o utilizzati all’interno dell’XML. In altre parole, dichiarano le regole con cui autorizzi qualcuno a creare un file XML all’interno del tuo stream di lavoro, e
  • Terzo, sia i DTD che gli schemi forniscono metodi per limitare o forzare il tipo o il formato di un elemento. Ad esempio, all’interno della DTD o dello schema è ansible forzare la scrittura di un campo data come 01/05/06 o 1/5/2006.

differenze:

  • Le DTD sono migliori per le applicazioni ad alto contenuto di testo, mentre gli schemi hanno diversi vantaggi per i flussi di lavoro ad alta intensità di dati.

  • Gli schemi sono scritti in XML e seguono quindi le stesse regole, mentre i DTD sono scritti in una lingua completamente diversa.

Esempi:

DTD:

 < ?xml version="1.0" encoding="UTF-8"?> < !ELEMENT employees (Efirstname, Elastname, Etitle, Ephone, Eemail)> < !ELEMENT Efirstname (#PCDATA)> < !ELEMENT Elastname (#PCDATA)> < !ELEMENT Etitle (#PCDATA)> < !ELEMENT Ephone (#PCDATA)> < !ELEMENT Eemail (#PCDATA)> 

XSD:

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

DTD può avere solo due tipi di dati, il CDATA e il PCDATA. Ma in uno schema è ansible utilizzare tutti i tipi di dati primitivi che si utilizzano nel linguaggio di programmazione e si ha la flessibilità di definire i propri tipi di dati personalizzati.

Lo sviluppatore che crea uno schema può creare tipi di dati personalizzati basati sui tipi di dati principali e utilizzando diversi operatori e modificatori.

DTD XML

Lo scopo di una DTD è definire la struttura di un documento XML. Definisce la struttura con un elenco di elementi legali:

 < !ATTLIST contact type CDATA #IMPLIED> < !ELEMENT address1 ( #PCDATA)> < !ELEMENT city ( #PCDATA)> < !ELEMENT state ( #PCDATA)> < !ELEMENT zip ( #PCDATA)> 

Schema XML

Lo schema XML consente agli autori dello schema di specificare che i dati della quantità dell’elemento devono essere numerici o, più specificamente, un numero intero. Nell’esempio seguente ho usato una stringa:

          

Quando è uscito XML per la prima volta, ci è stato detto che avrebbe risolto tutti i nostri problemi: l’XML sarà facile da usare, infinitamente estensibile, eviterebbe la tipizzazione forte e non richiederebbe alcuna abilità di programmazione. Ho imparato a conoscere DTD e ho scritto il mio parser XML. Più di 15 anni dopo, vedo che la maggior parte degli XML non è facile da usare e non molto estendibile (dipende dal suo utilizzo). Non appena alcuni clogs intelligenti hanno collegato XML a un database, sapevo che i tipi di dati erano quasi inevitabili. E, dovresti vedere l’XSLT (file di trasformazione) che dovevo lavorare l’altro giorno. Se quello non è la programmazione, non so cosa sia! Al giorno d’oggi non è raro vedere tutti i tipi di problemi relativi ai dati XML o alle interfacce danneggiate. Amo XML ma, si è allontanato molto dal suo originale punto di partenza altruistico.

La risposta breve? I DTD sono stati deprecati a favore di XSD perché un XSD consente di definire una struttura XML con maggiore precisione.

DTD è piuttosto deprecato perché è limitato nella sua utilità come linguaggio dello schema, non supporta lo spazio dei nomi e non supporta il tipo di dati. Inoltre, la syntax di DTD è piuttosto complicata, il che rende difficile capire e mantenere ..

DTD indica la syntax dell’elemento XML

Gli schemi XML sono l’alternativa di Microsoft alla DTD per la convalida di XML