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> 

Так как я могу заставить его работать так, чтобы он отклонил недействительные теги?

Примечание: Я тестирую это в затмении. Вначале у меня возникли некоторые проблемы с тем, чтобы заставить его утверждать вообще, однако, похоже, сейчас он работает. Кроме того, валидатор в Notepad ++ дает точно такие же результаты.

ответ

3

Изменить

 <xs:element name="DoubleElement" /> 

в

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

В противном случае, вы эффективно позволяя DoubleElement разрешить любую информацию, так как по умолчанию для xs:element/@type (отсутствующего ребенка simplyType, ребенка complexType и @substitutionGroup атрибута) является ur-type definition (anyType).

Возможно, вы захотите сделать то же самое для других детей ElementList.

+0

Иисуса Христа. Спасибо. Так просто! Я слишком долго смотрел на него. – Taus