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

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

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



답변

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)의 차이점은 다음과 같습니다.

  • 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 파일로 로컬로 확장 할 수 있습니다.

답변

많은 사람들이 이전에 언급했듯이 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가 발명 된 가장 큰 이유 일 것입니다.


답변

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의 확장이므로 빠르게 배우는 것이 편리합니다.


답변

한 가지 차이점은 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.)


답변

유사점 :

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>