programing

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

skycolor 2023. 10. 4. 21:07
반응형

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

이 질문을 구글에서 검색해 보았지만 XML 스키마와 DTD(문서 유형 정의)가 무엇인지, 그리고 XML 스키마가 DTD에 비해 더 강력한 이유가 무엇인지 명확하게 이해되지 않습니다.

어떤 안내라도 해주시면 대단히 감사하겠습니다.

DTD를 스키마로 변환 기사의 DTD와 스키마 간의 차이 섹션에서:

DTD와 XML Schema의 중요한 차이점은 XML Schema가 XML 기반 구문을 사용하는 반면 DTD는 SGML DTD에서 고유한 구문을 유지한다는 것입니다.DTD는 새로운 구문을 학습해야 하기 때문에 종종 비판을 받지만 구문 자체는 매우 간결합니다.XML Schema의 경우는 그 반대인데, 이는 상세하지만 태그와 XML을 사용하여 XML 작성자가 XML Schema의 구문을 덜 위협적으로 인식해야 합니다.

DTD의 목적은 SGML DTD를 XML DTD로 변환하려는 애플리케이션을 위해 SGML과의 호환성 수준을 유지하는 것이었습니다.그러나 XML의 목표 중 하나인 "XML 마크업에서 엄격함은 최소한의 중요성"을 유지하는 것과 관련하여 구문을 간략하게 유지하는 것에는 큰 문제가 없습니다.

[...]

그렇다면 DTD를 변환할 때 특히 중요할 수 있는 다른 차이점은 무엇입니까?어디 한번 봅시다.

타자 치기

DTD와 XML 스키마의 가장 중요한 차이점은 스키마에서 요소 및 속성 선언과 함께 데이터 유형을 생성하고 사용할 수 있는 기능입니다.사실 XML 스키마 권장사항의 절반이 데이터 타이핑 및 XML 스키마에 사용될 정도로 중요한 차이점이 있습니다.이 책의 제III부 "XML 스키마 데이터 유형"에서 데이터 유형에 대해 자세히 설명합니다.

[...]

발생 제약 조건

DTD와 스키마가 크게 다른 또 다른 영역은 발생 제약 조건입니다.2장의 이전 예인 "Schema Structure"(또는 DTD와 관련된 본인의 작업)를 기억한다면, 요소의 발생 횟수를 제한하는 데 사용할 수 있는 기호는 *, + 및 ? 세 가지입니다.

[...]

열거형

예를 들어, 우리가 요소를 가지고 있었고, 사용자가 작은, 중간 또는 큰 사이즈를 선택할 수 있도록 하는 셔츠의 사이즈 속성을 정의할 수 있기를 원했습니다.DTD는 다음과 같습니다.

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

[...]

요.size요소가 되려구요?우리는 DTD 로는 그럴 수 없습니다..DTD는 요소의 텍스트 내용에 열거를 제공하지 않습니다.한 데이터 할 때 나 Schema했습니다를 simpleType을 받은size_values이제 요소와 함께 사용할 수 있습니다.

<xs:element name="size" type="size_value">

[...]

XML 스키마 정의(XSD)와 문서 유형 정의(DTD)의 차이점은 다음과 같습니다.

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

이 탄환들이 모두 100% 정확한 것은 아니지만, 요점은 알 수 있습니다.

반면에:

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

많은 사람들이 이전에 언급했듯이 XML 스키마는 XML 기반 구문을 사용하고 DTD는 고유한 구문을 사용합니다.DTD는 데이터 유형을 지원하지 않으므로 중요합니다.

대학에 여러 명의 학생이 있고 각 학생이 "이름"과 "학년" 두 개의 요소를 가지고 있는 매우 간단한 예를 보자.제 코드에는 댓글로만 "// -->"을 사용하고 있으니 참고하시기 바랍니다.

enter image description here

이제 이 예시를 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에서 요소의 내용 모델은 문서에 나타나는 위치와 관계없이 이름에 의해 완전히 결정된다는 것입니다.

당신이 갖고 싶어한다는 가정하에

  • a person
  • name
  • name그 자체는 아동적 요소를 가지고 있습니다.first그리고.last.

이것처럼.

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

만약에city이 있어야 . 소 름'다가 . DTD에서 름'다를하는합니다.first그리고.last뿐만 아니라.입니다라는 말입니다.city.name 없음first그리고.last어린 시절에

할 수 로 를 도 있습니다.name두 요소person그리고.city따로따로 적절한 합니다.따라서 이러한 맥락에서 적절한 콘텐츠 모델을 제공합니다.

또 다른 주요 차이점은 네임스페이스를 지원한다는 것입니다.DTD는 원래 XML 규격의 일부이며(SGML에서 상속됨) XML 네임스페이스가 나중에 지정되었기 때문에 네임스페이스를 전혀 인식하지 못합니다.DTD는 네임스페이스와 함께 사용할 수 있지만, 임의의 접두사를 사용할 수 없는 대신 DTD에서 접두사를 강제로 정의하고 해당 접두사만 사용하는 등의 왜곡이 필요합니다.

저에게 다른 차이점들은 대부분 피상적인 것들입니다.은 DTD에 할 수 일 뿐입니다. (으로 유지 관리하고 은 으며 구문은 구문일 뿐입니다. (나는 XML 스키마 구문이 끔찍하다고 생각하며 XML 스키마를 수동으로 유지 관리하고 싶지 않습니다. DTD나 REX NG 스키마에 대해서는 말하지 않습니다. 어떤 이유로 XML 스키마가 필요하다면 보통 REX 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>

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>

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

스키마를 구축하는 개발자는 핵심 데이터 유형을 기반으로 다양한 연산자 및 수정자를 사용하여 사용자 지정 데이터 유형을 생성할 수 있습니다.

XML이 처음 나왔을 때, 우리는 XML이 우리의 모든 문제를 해결해 줄 것이라고 들었습니다. XML은 사용자 친화적이고, 무한 확장이 가능하며, 강력한 타이핑을 피할 수 있으며, 프로그래밍 기술을 필요로 하지 않습니다.저는 DTD에 대해 배우고 XML 파서를 직접 작성했습니다.15년 이상이 지난 지금, 대부분의 XML은 사용자 친화적이지 않으며 확장성도 매우 높지 않습니다(사용 용도에 따라).몇 가지 교묘한 방해물이 XML을 데이터베이스에 연결하자마자 저는 데이터 유형이 거의 불가피하다는 것을 알았습니다.그리고 저번에 제가 작업해야 했던 XSLT(변환 파일)도 봐야 합니다.프로그래밍이 아니라면 뭐가 뭔지 모르겠어요!요즘은 XML 데이터나 인터페이스와 관련된 모든 종류의 문제가 나빠지는 것이 드문 일이 아닙니다.저는 XML을 좋아하지만, 그것은 원래 이타적인 출발점에서 멀리 벗어났습니다.

단답형?XSD를 사용하면 XML 구조를 보다 정확하게 정의할 수 있기 때문에 DTD는 XSD를 선호하여 더 이상 사용되지 않습니다.

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

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

XML 스키마(XML Schemas)는 XML을 검증하기 위한 DTD의 대안입니다.

언급URL : https://stackoverflow.com/questions/1544200/what-is-difference-between-xml-schema-and-dtd

반응형