Я пытаюсь определить 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 ++ дает точно такие же результаты.
Иисуса Христа. Спасибо. Так просто! Я слишком долго смотрел на него. – Taus