2017-11-30 3 views
0

Guten Abend, Ich versuche, ein Schema für einige XML zu erstellen, die ich brauche, aber zu überprüfen, wenn ich ein Validierungstool verwenden, erhalte ich folgende Fehlermeldung:XSD Mögliche Rekursion erkannt

Error!!! Possible recursion detected (element 'box'). Please correct your schema and try again.

Hier ist die XML ich möchte mit dem Schema zu handhaben zu können:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<document xmlns="http://somewhere.com" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://somewhere.com/xml/onxy/onyx.xsd" 
    version="0.1"> 

    <surface title="Test Surface"> 
     <meta name="Author" content="Somebody" /> 
     <link rel="stylesheet" type="text/css" href="example.css" /> 
     <layout> 

      <box id="box1"> 
       <text>Hello World</text> 
       <box> 
        <text>How Are You</text> 
        <text>Today</text> 
       </box> 
      </box> 

     </layout> 
    </surface> 
</document> 

Und hier ist das XML-Schema, das den Fehler verursacht:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://somewhere.com" 
    xmlns:onyx="http://somewhere.com" 
    elementFormDefault="qualified"> 

    <!-- A container for multiple sufrace elements. --> 
    <xs:element name="document"> 
     <xs:complexType> 
      <xs:sequence> 
       <xs:element name="surface" type="onyx:SurfaceType" minOccurs="1"/> 
      </xs:sequence> 
      <xs:attribute name="version" type="xs:string" use="required" /> 
     </xs:complexType> 
    </xs:element> 

    <xs:complexType name="SurfaceType"> 
     <xs:sequence> 
      <xs:element name="meta" type="onyx:MetaType" /> 
      <xs:element name="link" type="onyx:LinkType" /> 
      <xs:element name="layout" type="onyx:LayoutType" minOccurs="1" maxOccurs="1" /> 
     </xs:sequence> 
     <xs:attribute name="title" type="xs:string" use="required" /> 
    </xs:complexType> 

    <xs:complexType name="LayoutType"> 
     <xs:sequence> 
      <xs:element name="box" type="onyx:ContentType" /> 
      <xs:element name="text" type="onyx:ContentType" /> 
     </xs:sequence> 
     <xs:anyAttribute/> 
    </xs:complexType> 

    <xs:complexType name="ContentType" mixed="true"> 
     <xs:sequence> 
      <xs:element name="box" type="onyx:ContentType" /> 
      <xs:element name="text" type="onyx:ContentType" /> 
     </xs:sequence> 
     <xs:anyAttribute/> 
    </xs:complexType> 

    <xs:complexType name="MetaType"> 
     <xs:attribute name="name" type="xs:string" use="required" /> 
     <xs:attribute name="content" type="xs:string" use="required" /> 
    </xs:complexType> 

    <xs:complexType name="LinkType"> 
     <xs:attribute name="rel" type="xs:string" use="required" /> 
     <xs:attribute name="type" type="xs:string" use="required" /> 
     <xs:attribute name="href" type="xs:string" use="required" /> 
    </xs:complexType> 

</xs:schema> 

Um dies zu verdeutlichen, möchte ich Kinder von box und text Elemente auf die Namen box und text beschränken, aber nicht einschränken, wie viele auftreten können und wie tief die Rekursion gehen kann.

Ich hätte nicht gefragt, ob nicht online und SO gründlich gesucht, danke für jede Hilfe, die Sie anbieten können.

Antwort

0

Ihr aktuelles Schema erfordert, dass jedes Element onyx:box ein anderes Element onyx:box enthält, daher ist die innere Box in Ihrem Beispiel ungültig (wie jedes andere XML-Dokument).

Wie bei jeder Rekursion müssen Sie einen nicht-rekursiven Basisschritt sowie einen rekursiven Schritt angeben. In Begriffen des Inhaltsmodells muss jedes Element, das sich in sich selbst nistet, erlaubt sein, sich selbst nicht zu enthalten. Ihr Prüfer scheint intelligent genug zu sein, um es zu bemerken und zu versuchen, ihm zu helfen.

(Ihr Content erlaubt auch nicht zwei text Elemente, so dass es auf diese Weise Ihr Beispiel zu beschreiben, scheitert auch, aber ich nehme an, dass aufklären können.)

+0

Nur auf dieser Antwort zu erweitern: die Fehlermeldung ist ein bisschen irreführend, weil es vorschlägt, dass ein Schema nicht rekursiv sein kann, was natürlich nicht der Fall ist. Das Problem hierbei ist, dass es sich um eine nicht terminierende Rekursion handelt. Tatsächlich gibt es in der Spezifikation keine Regel gegen ein solches Schema, aber da das Schema niemals gültige (endliche) Instanzen haben kann, ist es vernünftig, dass der Prozessor Ihnen davon erzählt. –

+0

Was ich versuche, das Schema zu erkennen, ist, dass eine Box oder ein Textelement nur Box- oder Textelemente enthalten kann. Gibt es keine Möglichkeit, das in xsd auszudrücken? – Kodaloid

+0

Ja, natürlich gibt es das, aber ich werde es nicht für dich aufschreiben; Mein Ziel ist es, Ihnen zu helfen, es selbst zu entdecken. Ihr aktuelles Schema ist ein erster Schritt, aber es scheint nicht zu sagen, was Sie sagen möchten, da Ihre Beispieleingabe nicht gültig ist. Lies die Antwort und den Kommentar von MK und denke nach. Dann schaue dir minOccurs an und überlege dir, wie das helfen könnte, einen Typ zu definieren, gegen den alle Vorkommen von onyx: box in deiner Instanz gültig wären. –

Verwandte Themen