2016-08-30 1 views
1

재귀적인 데이터 구조에 XML 스키마를 정의하려고합니다. 기본적으로 요소는 자식 및 속성을 가질 수 있어야하며, 이는 차례대로 자식 및 속성을 가질 수있는 요소의 목록입니다. "요소"는 유형의 범위 중 하나 일 수 있으며, 모두 일부 추가 데이터 외에도 하위 요소 및 특성을 가질 가능성이 있습니다. 따라서 요소 유형은 BaseElementType에서 계승되고 맨 위에 자체 데이터가 추가됩니다.내 XSD가 일부 요소의 유효성을 검사하지 않는 이유는 무엇입니까?

나는 약간의 진전을 보였지만 유효성 검사기가 구조체를 내려갈 때 거의 아무 것도 받아들이지 않고 문제가 발생했습니다. 다음과 같이

내 스키마는 다음과 같습니다

여기
<?xml version="1.0" encoding="utf-8"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/ElementSchema" xmlns="http://www.example.org/ElementSchema"> 


    <xs:element name="BaseElement" type="BaseElementType" /> 
    <xs:element name="DoubleElement" type="DoubleElementType" /> 
    <xs:element name="BoundedDoubleElement" type="BoundedDoubleElementType" /> 


    <xs:element name="Properties" type="ElementList" /> 
    <xs:element name="Children" type="ElementList" /> 

    <xs:complexType name="ElementList"> 
     <xs:choice minOccurs="1" maxOccurs="unbounded"> 
      <xs:element name="BaseElement" /> 
      <xs:element name="DoubleElement" /> 
      <xs:element name="BoundedDoubleElement" /> 
     </xs:choice> 
    </xs:complexType> 

    <xs:complexType name="BaseElementType"> 
     <xs:sequence> 
      <xs:element name="Children" type="ElementList" minOccurs="0" /> 
      <xs:element name="Properties" type="ElementList" 
       minOccurs="0" /> 
     </xs:sequence> 
     <xs:attribute name="ID" type="xs:positiveInteger" use="required" /> 
     <xs:attribute name="Key" type="xs:string" use="required" /> 
    </xs:complexType> 

    <xs:complexType name="DoubleElementType"> 
     <xs:complexContent> 
      <xs:extension base="BaseElementType"> 
       <xs:sequence> 
        <xs:element name="Value" type="xs:float" /> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 

    <xs:complexType name="BoundedDoubleElementType"> 
     <xs:complexContent> 
      <xs:extension base="DoubleElementType"> 
       <xs:sequence> 
        <xs:element name="DesiredValue" type="xs:float" /> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:schema> 

내가 확인하려고하는 XML 파일입니다. 태그 <wrongAccepted><wrongRejected>을 몇 군데에 삽입하여 유효성 검사가 예상대로 작동하는 위치와 불법 태그를 허용하는 위치를 보여줍니다.

<?xml version="1.0" encoding="utf-8"?> 
<t:BoundedDoubleElement ID="12" Key="test" 
    xmlns:t="http://www.example.org/ElementSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.example.org/ElementSchema ElementSchema.xsd"> 
    <Children> 
     <BaseElement ID="13" Key="child"> 
      <Properties> 
       <DoubleElement ID="10" Key="Null"> 
        <Value>-INF</Value> 
        <wrongAccepted></wrongAccepted> 
       </DoubleElement> 
       <wrongAccepted></wrongAccepted> 
      </Properties> 
     </BaseElement> 
     <wrongRejected></wrongRejected> 
    </Children> 
    <Properties> 
     <wrongRejected></wrongRejected> 
     <DoubleElement ID="10" Key="Null" Role="LowerBound" Tag="-1"> 
      <Value>-INF</Value> 
      <wrongAccepted></wrongAccepted> 
     </DoubleElement> 
     <DoubleElement ID="11" Key="Null" Role="UpperBound" Tag="-1"> 
      <Value>INF</Value> 
     </DoubleElement> 
    </Properties> 
    <Value>10</Value> 
    <DesiredValue>10</DesiredValue> 
    <wrongRejected></wrongRejected> 
</t:BoundedDoubleElement> 

그래서 어떻게하면 유효하지 않은 태그를 거부 할 수 있습니까?

참고 :이 테스트는 일식입니다. 나는 처음에는 그것을 검증하는 데 몇 가지 문제가 있었지만 지금은 효과가있는 것으로 보인다. 또한 메모장 ++의 유효성 검사기는 정확히 동일한 결과를 산출합니다.

답변

3

변경

 <xs:element name="DoubleElement" /> 

그렇지 않으면

 <xs:element name="DoubleElement" type="DoubleElementType"/> 

, 당신은 효과적으로 xs:element/@type (결석 아동 simplyType, 아이 complexType@substitutionGroup 속성)의 기본이기 때문에 어떤 콘텐츠를 허용하는 DoubleElement을 허용하고 ur-type definition (anyType).

ElementList의 다른 하위 항목에 대해 동일한 작업을 수행하려는 것이 좋습니다.

+0

예수 그리스도. 고맙습니다. 너무 간단! 나는 너무 오랫동안 그것을 꼼짝 않고 바라보고 있었다. – Taus

관련 문제