2009-04-07 7 views
1

나는 항상 XMLSchemas와 DTD가 동일하다고 생각했지만 후자는 상속과 같은 복잡한 관계를 모델링 할 때 사용하기가 더 어렵다. 사용 을 < 데이터 내부DTD와 XMLSchemas의 동등성

<data> 
<array> 
    <int></int> 
    <int></int> 
</array> 
</array> 
    <float></float> 
    <float></float> 
</array> 
<int><int> 
<float></float> 
</data> 

요소> 임의의 순서로 나타날 수 있으며 각 카디널리티 0 ..입니다 * :

최근이 같은 구조를 가지고 문서의 유효성을 검사하는 스키마를 구축하고 싶어xs : all>을 사용하여 복합 유형을 정의한 경우 XMLSchema는 순서가 잘못되었지만 최대 카디널리티는 1입니다. < xs : sequence> 및 < xs : choice>는 다른 확실한 후보이지만 더 많은 것입니다. 내가 원하는 것보다 제한적이야. 상응하는 스키마를 구축하거나 여기 DTD를 사용해야 않는 방법이 있나요

<!ELEMENT data (array | float | int)*> 

:

그럼 내가 DTD는과 같이 이것을 달성 할 수있을 것으로 보인다 것으로 나타났습니다?

답변

0

: 여기

은 XML 파일에 맞는 샘플 XSD입니다. 사실, XML 스키마를 사용하여 원래의 문제를 해결할 수 있습니다.

올바른 방법은 모든 다양한 옵션 (ints, float, arrays) 중에서 하나를 포함하는 그룹 요소를 정의하는 것이며 각 요소는 카디널리티 0 .. *을가집니다. 여기서

<xs:group name="dataTypesGroup"> 
    <xs:choice> 
     <xs:element name="int" type="intType"/> 
     <xs:element name="float" type="floatType"/> 
     <xs:element name="array"> 
      <xs:complexType> 
       <xs:choice> 
        <xs:element name="int" type="xs:integer" minOccurs="0" maxOccurs="unbounded"/> 
        <xs:element name="float" type="xs:float" minOccurs="0" maxOccurs="unbounded"/> 
       </xs:choice> 
       <xs:attribute name="id" use="required"></xs:attribute> 
      </xs:complexType>  
     </xs:element> 
    </xs:choice> 
</xs:group> 

, 그것은 늘리면

<xs:element name="data" minOccurs="0" maxOccurs="unbounded"> 
    <xs:complexType> 
     <xs:group ref="dataTypesGroup" minOccurs="0" maxOccurs="unbounded"/> 
    </xs:complexType> 
</xs:element> 

등 .. * 0으로 그룹의 카디널리티 복합 타입 정의에서 그룹을 참조하고 설정 유지된다. (특히 RelaxNG의 구문과 비교하면) 약간 자세한 정보가 있지만, XML 스키마가 훨씬 더 잘 지원된다는 것이 장점입니다. 필자는 원래의 문제를 해결하기 위해 RelaxNG 기반의 파서를 만들었지 만 JING과 같은 사용 가능한 유효성 검사기는 Java와 함께 제공되는 XML 스키마 기반 도구를 사용하는 것보다 훨씬 덜컹 거리다.

1

요소의 순서를 유지하면 XSD를 통해서만 수행 할 수 있으므로 xs : sequence을 사용할 수 있습니다. 내 말은, 항상 플로트배열 (있는 경우) 후 올 것이다, 및과 INT은 항상 당신이 많은 ocurreces을 반복 할 수 있습니다 고려하는 플로트 (있는 경우) 후 올 것이다 당신은 각 타입을 원한다. 모든 복잡한 유형은 컨텐츠 유형 (요소가 다른 중첩 그룹 유형 등) 중 어떤 바운드 속성을 지원하지 않습니다

이유 XSD는 XS이다. 다른 "완화 된"스키마를 사용하면 상태에 따라 DTD, RelaxNG 등을 수행 할 수 있습니다. 나는 이전의 대답은 잘못된 나는이 돌아올 거라고 생각

<?xml version="1.0" encoding="UTF-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"> 
    <xs:complexType name="arrayType"> 
      <xs:sequence> 
       <xs:element name="array" type="arrayType" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element name="int" minOccurs="0" maxOccurs="unbounded"/> 
       <xs:element name="float" minOccurs="0" maxOccurs="unbounded"/> 
      </xs:sequence> 
    </xs:complexType> 
    <xs:element name="data" type="arrayType"/> 
</xs:schema> 
+0

감사합니다. Fernando. 데이터가 생성되는 방식으로 인해 특정 시퀀스가 ​​있다고 가정 할 수 없으므로 몇 가지 대안을 살펴 보겠습니다. 매우 느슨하게 요소 데이터를 유효성을 검사 할 수 없기 때문에 DTD를 사용하고 싶지 않습니다. RelaxNG * 손가락이 교차합니다. – Daniel

관련 문제