XML 스키마와 DTD의 차이점은 무엇입니까?


175

나는이 질문을 봤지만 XML 스키마와 DTD (문서 유형 정의)가 무엇이며 XML 스키마가 DTD에 비해 더 강력한 이유를 명확하게 이해하지 못합니다.

모든 지침은 높이 평가 될 것입니다.

답변:


136

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">

[...]


1
참고로 W3C는 DTD가 XML 스키마 언어의 한 유형이라고 생각하는 것 같습니다. "다양한 스키마 언어가 널리 사용되고 있지만 주요 언어는 DTD (Document Type Definitions), Relax-NG, Schematron 및 W3C XSD ( "스키마 정의"). " w3.org/standards/xml/schema
Mordechai

1
@ Mordechai DTD를 XML 스키마가 아닌 스키마 언어 로 지정하고 있다고 생각 합니다.
kaartic

90

XSD (XML Schema Definition)와 DTD (Document Type Definition)의 차이점은 다음과 같습니다.

  • XML 스키마는 XML로 작성되고 DTD는 SGML 구문에서 파생됩니다.
  • XML 스키마는 요소 및 속성에 대한 데이터 유형을 정의하지만 DTD는 데이터 유형을 지원하지 않습니다.
  • XML 스키마는 네임 스페이스를 지원하지만 DTD는 지원하지 않습니다.
  • XML 스키마는 자식 요소의 수와 순서를 정의하지만 DTD는 정의하지 않습니다.
  • XML 스키마는 XML DOM으로 직접 조작 할 수 있지만 DTD의 경우에는 불가능합니다.
  • XML 스키마를 사용하는 사용자는 새로운 언어를 배울 필요는 없지만 DTD 작업은 사용자에게 어렵습니다.
  • XML 스키마는 안전한 데이터 통신을 제공합니다. 즉, 발신자가 수신자가 이해할 수있는 방식으로 데이터를 설명 할 수 있지만 DTD 데이터의 경우 수신자가 오해 할 수 있습니다.
  • XML 스키마는 확장 가능하지만 DTD는 확장 할 수 없습니다.

업데이트 : 2015.08.26

이 글 머리 기호가 모두 100 % 정확하지는 않지만 요점을 알 수 있습니다.

반면에 :

  • DTD를 사용하면 XML 파일에 사용할 새 ENTITY 값을 정의 할 수 있습니다 .
  • DTD를 사용하면 개별 XML 파일로 로컬로 확장 할 수 있습니다.

21

많은 사람들이 이전에 언급했듯이 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>

16

DTD는 XML보다 우선하므로 유효한 XML 자체가 아닙니다. 아마도 XSD가 발명 된 가장 큰 이유 일 것입니다.


정확히-XSD / XML 스키마는 XML 자체입니다. 정말 좋습니다!
marc_s

흠, XSD는 XML 구문보다 더 많은 것을 추가합니다. 예를 들어, 데이터 유형
Rubens Farias

9

XSD와 DTD의 유사점

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

XSD와 DTD의 차이점

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

또한 XSD는 거의 장황하지만 구문은 XML의 확장이므로 빠르게 배우는 것이 편리합니다.


2
DTD가 더 XSD까지로보다 제한됩니다 #occurences 의 선택으로 1, 0 or 1, 0 or more, XSD는 최소 및 최대 수를 지정할 수있다.
Jesse Chisholm 21:53에

8

한 가지 차이점은 DTD에서 요소의 컨텐츠 모델은 문서에서 표시되는 위치와 상관없이 해당 이름으로 완전히 결정된다는 것입니다.

갖고 싶다고 가정

  • person요소
  • 하위 요소와 함께 name
  • name자체는 자식 요소가 firstlast.

이렇게

   <person>
       <name>
            <first></first>
            <last></last>
       </name>
   </person>

경우 city같은 문서의 요소는 자식 요소의 이름을 '이 필요가 DTD는이'이름 '요소는 자식 요소가 있어야합니다 것을 요구 first하고 last뿐만 아니라. 사실에도 불구하고 city.name필요로하지 않습니다 firstlast어린이 등.

반대로 XML 스키마를 사용하면 하위 요소 유형을 로컬로 선언 할 수 있습니다. 당신은 선언 할 수 name모두 자식 요소 personcity별도로 있습니다. 따라서 그러한 맥락에서 적절한 콘텐츠 모델을 제공합니다.

다른 주요 차이점은 네임 스페이스 지원입니다. DTD는 원래 XML 사양의 일부이며 SGML에서 상속되므로 XML 네임 스페이스가 나중에 지정되었으므로 네임 스페이스를 인식하지 못합니다. 네임 스페이스와 함께 DTD를 사용할 수 있지만 DTD에서 접두사를 정의하고 임의의 접두사를 사용하는 대신 접두사 만 사용하는 것과 같은 일부 왜곡이 필요합니다.

나에게 다른 차이점은 대부분 피상적입니다. DTD에 데이터 유형 지원을 쉽게 추가 할 수 있으며 구문은 구문 일뿐입니다. (저는 XML 스키마 구문이 끔찍한 것을 발견하고 DTD 또는 RELAX NG 스키마에 대해서는 언급하지 않을 XML 스키마를 손으로 유지하고 싶지 않습니다. 어떤 이유로 XML 스키마가 필요한 경우 일반적으로 작성합니다. RELAX NG 하나를 사용하여 변환하십시오 trang.)


6

유사점 :

DTD와 스키마는 모두 동일한 기본 기능을 수행합니다.

  • 먼저, 요소와 속성의 세탁 목록을 선언합니다.
  • 둘째, 둘 다 이러한 요소가 XML 내에서 그룹화, 중첩 또는 사용되는 방식을 설명합니다. 다시 말해, 누군가 워크 플로 내에서 XML 파일을 만들 수 있도록 허용하는 규칙을 선언합니다.
  • 셋째, DTD와 스키마는 요소의 유형이나 형식을 제한하거나 강제하는 방법을 제공합니다. 예를 들어 DTD 또는 스키마 내에서 날짜 필드를 01/05/06 또는 1/5/2006으로 작성하도록 할 수 있습니다.

차이점 :

  • 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>

4

DTD는 CDATA와 PCDATA의 두 가지 유형의 데이터 만 가질 수 있습니다. 그러나 스키마에서는 프로그래밍 언어에서 사용하는 모든 기본 데이터 형식을 사용할 수 있으며 고유 한 사용자 지정 데이터 형식을 유연하게 정의 할 수 있습니다.

스키마를 구축하는 개발자는 핵심 데이터 유형과 다른 연산자 및 수정자를 사용하여 사용자 정의 데이터 유형을 작성할 수 있습니다.


DTD는 열거 형 값 이라고하는 CDATA의 하위 집합을 가질 수도 있습니다 .
Jesse Chisholm

4

XML이 처음 나왔을 때 우리는 모든 문제를 해결할 것이라고 들었습니다. XML은 사용자에게 친숙하고 무한히 확장 가능하며 강력한 타이핑을 피하고 프로그래밍 기술이 필요하지 않습니다. 나는 DTD에 대해 배우고 내 자신의 XML 파서를 작성했다. 15 년이 지난 후, 나는 대부분의 XML이 사용자 친화적이지 않으며, 사용에 따라 확장 성이 높지 않다는 것을 알았습니다. 일부 영리한 막힘이 XML을 데이터베이스에 연결하자마자 데이터 유형이 모두 불가피하다는 것을 알았습니다. 그리고 다른 날에 작업해야했던 XSLT (변환 파일)가 표시되어야합니다. 그것이 프로그래밍이 아니라면, 나는 무엇인지 모른다. 요즘 XML 데이터 또는 인터페이스와 관련된 모든 종류의 문제가 사라지는 것은 드문 일이 아닙니다. 나는 XML을 좋아하지만 원래의 이타 적 출발점과는 거리가 멀다.

짧은 대답? XSD를 사용하면 XML 구조를보다 정확하게 정의 할 수 있기 때문에 DTD는 XSD를 위해 사용되지 않습니다.


4

XML DTD

DTD 의 목적은 XML 문서의 구조를 정의하는 것입니다. 유효한 요소 목록으로 구조를 정의합니다.

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

XML 스키마

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>


2

DTD는 스키마 언어로서의 유용성이 제한되고 네임 스페이스를 지원하지 않으며 데이터 유형을 지원하지 않기 때문에 거의 사용되지 않습니다. 또한 DTD의 구문은 매우 복잡하여 이해하고 유지하기가 어렵습니다.


2
더 이상 사용되지 않습니까? 아니요. [XDR은 ​​더 이상 사용되지 않습니다] 패션에서 벗어나십니까? 아마도. XSD보다 더 제한적입니까? 예. XSD 기능의 기능 하위 집합? 아니요. 구문이 너무 복잡합니까? 거의 다르지 않습니다 (IMHO). 개인적으로 DTD는 XML이 아니기 때문에 XSD보다 정확하게 읽을 수 있습니다.
Jesse Chisholm

-7

DTD는 XML 요소의 구문을 나타냅니다.

XML 스키마는 XML 유효성 검사를위한 Microsoft의 DTD 대안입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.