답변:
DTD를 스키마 기사 로 변환의 DTD 와 스키마 의 차이점 섹션에서 :
DTD와 XML 스키마의 중요한 차이점은 XML 스키마는 XML 기반 구문을 사용하는 반면 DTD는 SGML DTD에서 고유 한 구문을 유지한다는 것입니다. DTD가 새로운 구문을 배울 필요가 있기 때문에 종종 비판을 받지만 구문 자체는 매우 간결합니다. XML 스키마의 경우는 정반대이지만 자세한 내용은 태그와 XML을 사용하므로 XML 작성자는 XML 스키마 구문이 덜 협박해야합니다.
DTD의 목표는 SGML DTD를 XML DTD로 변환하려는 응용 프로그램에 대해 SGML과의 호환성 수준을 유지하는 것이 었습니다. 그러나 XML의 목표 중 하나를 유지하면서 "XML 마크 업의 중요성은 최소한으로 중요합니다"라는 구문을 간결하게 유지하는 데 실제적인 관심사는 없습니다.
[...]
DTD를 변환 할 때 특히 중요한 다른 차이점은 무엇입니까? 한 번 보자.
타자
DTD와 XML 스키마의 가장 큰 차이점은 요소 및 속성 선언과 함께 스키마에서 데이터 유형을 작성하고 사용하는 기능입니다. 실제로 XML 스키마 권장 사항의 절반이 데이터 형식 및 XML 스키마에 전념한다는 것은 중요한 차이점입니다. 이 책의 Part III, "XML Schema Datatypes"에서 데이터 유형을 자세히 다룬다.
[...]
발생 제약
DTD와 스키마가 크게 다른 또 다른 영역은 발생 제한입니다. 2 장 "스키마 구조"(또는 DTD 관련 작업)의 이전 예를 기억할 경우 요소 발생 횟수를 제한하는 데 사용할 수있는 세 가지 기호가 있습니다. *, + 및?
[...]
열거
따라서 요소가 있고 셔츠의 크기 속성을 정의하여 사용자가 작은, 중간 또는 큰 크기를 선택할 수 있기를 원한다고 가정 해 봅시다. 우리의 DTD는 다음과 같습니다.
<!ELEMENT item (shirt)> <!ELEMENT shirt (#PCDATA)> <!ATTLIST shirt size_value (small | medium | large)>
[...]
그러나 우리가
size
요소 가되고 싶다면 어떻게해야 할까요? DTD로는 그렇게 할 수 없습니다. DTD는 요소의 텍스트 내용에 열거를 제공하지 않습니다. 그러나 스키마가있는 데이터 유형으로 인해 앞의 예제에서 열거를 선언 할 때 실제로 요소와 함께 사용할 수 있는simpleType
호출size_values
을 작성했습니다 .<xs:element name="size" type="size_value">
[...]
XSD (XML Schema Definition)와 DTD (Document Type Definition)의 차이점은 다음과 같습니다.
업데이트 : 2015.08.26
이 글 머리 기호가 모두 100 % 정확하지는 않지만 요점을 알 수 있습니다.
반면에 :
많은 사람들이 이전에 언급했듯이 XML 스키마는 XML 기반 구문을 사용하고 DTD는 고유 한 구문을 갖습니다. DTD는 중요한 데이터 유형을 지원하지 않습니다.
대학에 여러 명의 학생이 있고 각 학생마다 "이름"과 "연도"라는 두 가지 요소가있는 매우 간단한 예를 살펴 보겠습니다. 주석에는 코드에서 "//->"를 사용하고 있습니다.
이제이 예제를 DTD와 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
]>
<university>
<student>
<name>
John Niel //---> I can also use an Integer,not good
</name>
<year>
2000 //---> I can also use a string,not good
</year>
</student>
</university>
XML 스키마 정의 (XSD)
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:complexType name ="uniType"> //--> complex datatype uniType
<xsd:sequence>
<xsd:element ref="student" maxOccurs="unbounded"/> //--> has unbounded no.of students
</xsd:sequence>
</xsd:complexType>
<xsd:complexType name="stuType"> //--> complex datatype stuType
<xsd:sequence>
<xsd:element ref="name"/> //--> has element name
<xsd:element ref="year"/> //--> has element year
</xsd:sequence>
</xsd:complexType>
<xsd:element name="university" type="uniType"/> //--> university of type UniType
<xsd:element name="student" type="stuType"/> //--> student of type stuType
<xsd:element name="name" type="xsd:string"/> //--> name of datatype string
<xsd:element name="year" type="xsd:integer"/> //--> year of datatype integer
</xsd:schema>
<?xml version="1.0" encoding="UTF-8"?>
<university>
<student>
<name>
John Niel
</name>
<year>
2000 //--> only an Integer value is allowed
</year>
</student>
</university>
DTD는 XML보다 우선하므로 유효한 XML 자체가 아닙니다. 아마도 XSD가 발명 된 가장 큰 이유 일 것입니다.
both specify elements, attributes, nesting, ordering, #occurences
XSD also has data types, (typed) pointers, namespaces, keys and more.... unlike DTD
또한 XSD는 거의 장황하지만 구문은 XML의 확장이므로 빠르게 배우는 것이 편리합니다.
1
, 0 or 1
, 0 or more
, XSD는 최소 및 최대 수를 지정할 수있다.
한 가지 차이점은 DTD에서 요소의 컨텐츠 모델은 문서에서 표시되는 위치와 상관없이 해당 이름으로 완전히 결정된다는 것입니다.
갖고 싶다고 가정
person
요소name
name
자체는 자식 요소가 first
와 last
.이렇게
<person>
<name>
<first></first>
<last></last>
</name>
</person>
경우 city
같은 문서의 요소는 자식 요소의 이름을 '이 필요가 DTD는이'이름 '요소는 자식 요소가 있어야합니다 것을 요구 first
하고 last
뿐만 아니라. 사실에도 불구하고 city.name
필요로하지 않습니다 first
및 last
어린이 등.
반대로 XML 스키마를 사용하면 하위 요소 유형을 로컬로 선언 할 수 있습니다. 당신은 선언 할 수 name
모두 자식 요소 person
와 city
별도로 있습니다. 따라서 그러한 맥락에서 적절한 콘텐츠 모델을 제공합니다.
다른 주요 차이점은 네임 스페이스 지원입니다. DTD는 원래 XML 사양의 일부이며 SGML에서 상속되므로 XML 네임 스페이스가 나중에 지정되었으므로 네임 스페이스를 인식하지 못합니다. 네임 스페이스와 함께 DTD를 사용할 수 있지만 DTD에서 접두사를 정의하고 임의의 접두사를 사용하는 대신 접두사 만 사용하는 것과 같은 일부 왜곡이 필요합니다.
나에게 다른 차이점은 대부분 피상적입니다. DTD에 데이터 유형 지원을 쉽게 추가 할 수 있으며 구문은 구문 일뿐입니다. (저는 XML 스키마 구문이 끔찍한 것을 발견하고 DTD 또는 RELAX NG 스키마에 대해서는 언급하지 않을 XML 스키마를 손으로 유지하고 싶지 않습니다. 어떤 이유로 XML 스키마가 필요한 경우 일반적으로 작성합니다. RELAX NG 하나를 사용하여 변환하십시오 trang
.)
유사점 :
DTD와 스키마는 모두 동일한 기본 기능을 수행합니다.
차이점 :
DTD는 텍스트를 많이 사용하는 응용 프로그램에 적합하고 스키마는 데이터를 많이 사용하는 워크 플로에 몇 가지 장점이 있습니다.
스키마는 XML로 작성되므로 동일한 규칙을 따르지만 DTD는 완전히 다른 언어로 작성됩니다.
예 :
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"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:od="urn:schemas-microsoft-com:officedata">
<xsd:element name="dataroot">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="employees" minOccurs="0" maxOccurs="unbounded"/>
</xsd:sequence>
<xsd:attribute name="generated" type="xsd:dateTime"/>
</xsd:complexType>
</xsd:element>
<xsd:element name="employees">
<xsd:annotation>
<xsd:appinfo>
<od:index index-name="PrimaryKey" index-key="Employeeid " primary="yes"
unique="yes" clustered="no"/>
<od:index index-name="Employeeid" index-key="Employeeid " primary="no" unique="no"
clustered="no"/>
</xsd:appinfo>
</xsd:annotation>
<xsd:complexType>
<xsd:sequence>
<xsd:element name="Elastname" minOccurs="0" od:jetType="text"
od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Etitle" minOccurs="0" od:jetType="text" od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Ephone" minOccurs="0" od:jetType="text"
od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Eemail" minOccurs="0" od:jetType="text"
od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
<xsd:element name="Ephoto" minOccurs="0" od:jetType="text"
od:sqlSType="nvarchar">
<xsd:simpleType>
<xsd:restriction base="xsd:string">
<xsd:maxLength value="50"/>
</xsd:restriction>
</xsd:simpleType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
DTD는 CDATA와 PCDATA의 두 가지 유형의 데이터 만 가질 수 있습니다. 그러나 스키마에서는 프로그래밍 언어에서 사용하는 모든 기본 데이터 형식을 사용할 수 있으며 고유 한 사용자 지정 데이터 형식을 유연하게 정의 할 수 있습니다.
스키마를 구축하는 개발자는 핵심 데이터 유형과 다른 연산자 및 수정자를 사용하여 사용자 정의 데이터 유형을 작성할 수 있습니다.
XML이 처음 나왔을 때 우리는 모든 문제를 해결할 것이라고 들었습니다. XML은 사용자에게 친숙하고 무한히 확장 가능하며 강력한 타이핑을 피하고 프로그래밍 기술이 필요하지 않습니다. 나는 DTD에 대해 배우고 내 자신의 XML 파서를 작성했다. 15 년이 지난 후, 나는 대부분의 XML이 사용자 친화적이지 않으며, 사용에 따라 확장 성이 높지 않다는 것을 알았습니다. 일부 영리한 막힘이 XML을 데이터베이스에 연결하자마자 데이터 유형이 모두 불가피하다는 것을 알았습니다. 그리고 다른 날에 작업해야했던 XSLT (변환 파일)가 표시되어야합니다. 그것이 프로그래밍이 아니라면, 나는 무엇인지 모른다. 요즘 XML 데이터 또는 인터페이스와 관련된 모든 종류의 문제가 사라지는 것은 드문 일이 아닙니다. 나는 XML을 좋아하지만 원래의 이타 적 출발점과는 거리가 멀다.
짧은 대답? XSD를 사용하면 XML 구조를보다 정확하게 정의 할 수 있기 때문에 DTD는 XSD를 위해 사용되지 않습니다.
DTD 의 목적은 XML 문서의 구조를 정의하는 것입니다. 유효한 요소 목록으로 구조를 정의합니다.
<!ATTLIST contact type CDATA #IMPLIED>
<!ELEMENT address1 ( #PCDATA)>
<!ELEMENT city ( #PCDATA)>
<!ELEMENT state ( #PCDATA)>
<!ELEMENT zip ( #PCDATA)>
XML 스키마를 사용하면 스키마 작성자는 요소 수량의 데이터를 숫자 또는보다 구체적으로 정수 여야한다고 지정할 수 있습니다. 다음 예제에서는 다음을 사용했습니다 string
.
<xs:element name="note">
<xs:complexType>
<xs:sequence>
<xs:element name="address1" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="state" type="xs:string"/>
<xs:element name="zip" type="xs:string"/>
</xs:sequence>
</xs:complexType>
DTD는 스키마 언어로서의 유용성이 제한되고 네임 스페이스를 지원하지 않으며 데이터 유형을 지원하지 않기 때문에 거의 사용되지 않습니다. 또한 DTD의 구문은 매우 복잡하여 이해하고 유지하기가 어렵습니다.