Jak wybrać między DTD i XSD

Chcę użyć DTD lub XSD do opisania mojego dokumentu XML. Czytałem, że XSD są lepsze niż DTD, ponieważ obsługują przestrzenie nazw i typy danych, i że DTD są starsze.

Czy to oznacza, że powinienem używać tylko XSD dla wszystkich przyszłych potrzeb i całkowicie ignorować DTD jako opcję? Czy powinienem w ogóle uczyć się struktury DTD?

Jakie czynniki powinienem wziąć pod uwagę przy wyborze pomiędzy XSD a DTD?

 48
Author: Pops, 2010-03-05

7 answers

Prawdopodobnie ważne jest, aby nauczyć się DTD jako osobnego ćwiczenia, tylko dla wiedzy o tym, jak działają, na wypadek, gdybyś spotkał je gdzie indziej, i abyś mógł docenić niektóre z rzeczy, które XSD próbował rozwiązać.

Jednak, dla obecnych celów opisywania dokumentu XML, rzeczywiście trzymać się XSD.

Oprócz bogatszego zestawu funkcji (jak wspominasz, w tym typów danych i przestrzeni nazw), są to również same dokumenty XML, które mogą bądź naprawdę przydatny. Ponieważ są to XML, możesz o wiele łatwiej sprawdzić ich poprawność i poprawność, a także napisać kod, który działa z nimi jak zwykłe pliki XML (na przykład, jeśli chcesz autogenerować klasy kodu ze schematu)

 45
Author: Mike Mooney,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-15 18:02:39

To naprawdę zależy od tego, jak skomplikowana jest struktura, którą musisz skonfigurować.

Jeśli potrzebujesz przestrzeni nazw i typów danych, zdecydowanie skorzystaj z XSD. Jeśli potrzebujesz tylko szybkiego schematu do sprawdzenia, DTD da Ci szybszą wydajność, ponieważ nie ma parsowania XML.

Jak rozumiem, XSD wywodzi się z DTD, więc zrozumienie DTD da solidne podstawy do nauki XSD, Plus zwróci uwagę na niektóre krótkie wpadki DTD.

 7
Author: Brant,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 20:41:23

Nie zaszkodzi zrozumieć strukturę DTD (pomoże Ci to lepiej zrozumieć XSD na dłuższą metę)...ale powinieneś użyć XSD idąc do przodu.

 5
Author: Justin Niessner,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-05 20:36:59

Nie zaszkodzi nauczyć się DTD, ale pamiętaj, aby używać XSD, ponieważ XSD ma więcej siły,

Z XSD można nie tylko zweryfikować strukturę / hierarchię znaczników XML, ale także

  1. można zdefiniować typ danych wartości węzłów. [date, number, string etc]
  2. Można również zdefiniować własne data_types, [przykład, dla węzła , możliwe dane mogą być jeden z 12 miesięcy.. więc potrzebujesz aby zdefiniować wszystkie 12 miesięcy w nowym typ danych zapis wszystkich 12 miesięcy nazwy jako wartości wyliczania .. Walidacja pokazuje błąd, jeśli wejście XML zawiera dowolną-inną wartość niż te 12 wartości .. ]
  3. możesz umieścić ograniczenie na występowanie pierwiastków, za pomocą minOccurs i maxOccurs, domyślne wartości to 1 i 1.

.. i wiele innych ...

Istnieją pewne ograniczenia: jak,

  1. element (nazwa) zdefiniowany w pliku XSD musi być zdefiniowany tylko jednym typem danych.
  2. nie można zweryfikować węzła/atrybutu za pomocą wartość innego węzeł / atrybut.
 5
Author: InfantPro'Aravind',
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-08 13:45:18

To jest stary ciąg, ale na wypadek, gdyby ktoś inny się na niego natknął... z tego, co mogę powiedzieć, DTD nadal ma dwie korzyści, których nie ma XSD, a mianowicie włączenie funkcji encji, która nie istnieje w XSD. Jest to całkiem niesamowita funkcja, która mówi kompilatorowi, jak przetwarzać potencjalnie nieznane typy plików, identyfikując, jakie programy otworzyć, aby je przetworzyć.

Ponadto DTD są zapisywane do specyfikacji XML, dzięki czemu mogą być zapisywane bezpośrednio do dokumentów XML, podczas gdy XSD musi istnieje jako plik zewnętrzny i połączony. Nic wielkiego, zwłaszcza w przypadku używania w większych dokumentach.

Myślę, że XSD jest jeszcze dużo lepsze i bardziej naturalne, ponieważ używa składni XML, po prostu chciałem grać Devil ' s advocate :)

 2
Author: Joel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-16 16:06:55

Jest IMHO bardzo ważny problem, aby używać DTD (może razem z XSD, jeśli potrzebujesz in-deep-validation): {]}

W DTD można zdefiniować własne encje np:

<!ENTITY MyName "DrDr.Hannibal Xerxes Utah,MBA and CEO">

W Twoim dokumencie możesz po prostu wpisać kod & MyName; zamiast wpisywać wszystkie te rzeczy.

Ponadto Załóżmy, że masz plik podobny do XML (może wyprodukowany przez inną aplikację), który składa się z wielu podobnych tagów, ale nie ma znacznika głównego, np:

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- you need this when using foreign characters like 'ü' -->
<Book Author="Author1">
  <Titel>Erstes Buch</Titel>
</Book>
...
<Book Author="Author5">
  <Titel>Fünftes Buch</Titel>
</Book>

Załóżmy, że ten plik ma nazwę "Booklist.TXT",

Teraz możesz kodować swój master-xml:

<?xml version="1.0" encoding="ISO-8859-1"?> <!-- you need this when using foreign characters like 'ü' -->
<DOCTYPE MyRoot [
<ENTITY AllBooks SYSTEM "Booklist.TXT">
]

<MyRoot>
... some prefix-stuff as needed ...
&AllBooks; <!-- here are all the Books -->
... some post stuff es needed ...
</MyBook>

I za każdym razem, gdy potrzebujesz książek w innym kontekście, musisz tylko zakodować otaczający xml i nie dotykać ani nie kopiować sama lista książek, ponadto możesz ją konserwować w jednym miejscu i mieć wszystkie zmiany w dowolnym dokumencie.

 2
Author: MikeTheGuru,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-19 23:25:07

XML Schema może wykonywać bardziej złożone walidacje. Np. jeśli DTD sprawdza typ danych elementu XML to integer lub string.XML schema może wykonywać bardziej skomplikowane walidacje, np. jeśli element xml jest ciągiem rozpoczynającym się wielką literą lub dodatnią liczbą całkowitą. Wreszcie XML schema wykorzystuje składnię XML i jest naturalnym wyborem dla rozwoju usług internetowych.

 0
Author: Rohit Goyal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-04 18:18:30