2016-08-30 1 views
1

Ich versuche ein XML-Schema für eine rekursive Datenstruktur zu definieren. Grundsätzlich sollte ein Element in der Lage sein, Kinder und Eigenschaften zu haben, was eine Liste von Elementen ist, die wiederum Kinder und Eigenschaften haben können. Ein "Element" kann einer einer Reihe von Typen sein, die alle die Möglichkeit haben, zusätzlich zu einigen zusätzlichen Daten auch Kinder und Eigenschaften zu haben. Daher sind die Elementtypen in der BaseElementType angeordnet und fügen ihre eigenen Daten an der Spitze hinzu.Warum überprüft mein XSD einige Elemente nicht?

Ich habe einige Fortschritte gemacht, aber ich habe ein Problem mit dem Validator bekommen, der so ziemlich alles akzeptiert, wenn man sich in der Struktur nach unten bewegt.

Mein Schema ist wie folgt:

<?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> 

Hier ist eine XML-Datei, die ich zu validieren versuchen. Ich habe die Tags <wrongAccepted> und <wrongRejected> an mehreren Stellen eingefügt, um zu demonstrieren, wo sich die Validierung wie erwartet verhält und wo sie ungültige Tags akzeptiert.

<?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> 

Also wie bekomme ich es funktioniert so, dass es die ungültigen Tags zurückweist?

Hinweis: Ich teste dies in Eclipse. Ich hatte anfangs Probleme mit der Validierung, aber es scheint jetzt zu funktionieren. Zusätzlich liefert der Validator in Notepad ++ genau die gleichen Ergebnisse.

Antwort

3

ändern

 <xs:element name="DoubleElement" /> 

zu

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

Andernfalls Sie ermöglicht effektiv DoubleElement Inhalte zu ermöglichen, da der Standard für xs:element/@type (abwesend Kind simplyType, Kind complexType und @substitutionGroup Attribut) ist ur-type definition (anyType).

Sie möchten wahrscheinlich das gleiche für die anderen Kinder von ElementList tun.

+0

Jesus Christus. Vielen Dank. So einfach! Ich habe es viel zu lange angeguckt. – Taus

Verwandte Themen