2009-05-01 5 views
6

Mi piacerebbe la possibilità di avere un livello arbitrario di figli di nidificazione di uno stesso elemento genitore, ad esempio:come faccio a rendere un elemento un figlio di se stesso in XML Schema?

<path expr="/"> 
    <path expr="usr"> 
    <path expr="bin"> 
     <path expr="X11" /> 
    </path> 
    </path> 
    <path expr="var" /> 
</path> 

Sto scrivendo il file di schema XML, e io sono in perdita su come per rappresentare questa relazione padre/figlio nello schema: ecco quello che ho, ma non è una definizione di schema valido:

  <xs:element name="path"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element ref="path" minOccurs="0" /> 
       </xs:sequence> 
       <xs:attribute name="expr" type="xs:string" use="required" /> 
      </xs:complexType> 
      </xs:element> 

Update: Grazie per la risposta. L'ho provato e ho ricevuto il seguente errore: L'elemento "w3.org/2001/XMLSchema:complexType" non è supportato in questo contesto. Devo dire che la gerarchia percorso come ho descritto è di per sé un figlio di un elemento chiamato applicazione, in modo l'intera struttura assomiglia a questo:

<application name="test"> 
    <path expr="/"> 
    <path expr="usr"> 
     <path expr="bin"> 
     <path expr="X11" /> 
     </path> 
    </path> 
    <path expr="var" /> 
    </path> 
</application> 

risposta

5

Il seguente dovrebbe fare il trucco. Lo standard XSD è piuttosto difficile da lavorare direttamente, io uso sempre un editor come Liquid XML Studio.

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid XML Studio - Developer Pro Edition 7.1.1.1206 (http://www.liquid-technologies.com)--> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Path" type="PathType" /> 
    <xs:complexType name="PathType"> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="unbounded" name="Path" type="PathType" /> 
    </xs:sequence> 
    <xs:attribute name="expr" type="xs:string" use="required" /> 
    </xs:complexType> 
</xs:schema> 

alt text http://www.liquid-technologies.com/images/blogs/stackoverflow/PathExample.png

Il XSD è valida. Per il nuovo XML che hai descritto, dovrai cambiarlo in questo modo.

<?xml version="1.0" encoding="utf-8" ?> 
<!--Created with Liquid XML Studio - Developer Pro Edition 7.1.0.1135 (http://www.liquid-technologies.com)--> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 
    <xs:element name="Application"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element name="path" type="PathType" /> 
     </xs:sequence> 
     <xs:attribute name="name" type="xs:string" /> 
    </xs:complexType> 
    </xs:element> 
    <xs:complexType name="PathType"> 
    <xs:sequence> 
     <xs:element minOccurs="0" maxOccurs="unbounded" name="path" type="PathType" /> 
    </xs:sequence> 
    <xs:attribute name="expr" type="xs:string" use="required" /> 
    </xs:complexType> 
</xs:schema> 
+0

Grazie per la risposta. L'ho provato e ho ricevuto il seguente errore: L'elemento "http://www.w3.org/2001/XMLSchema:complexType" non è supportato in questo contesto. \t Devo dire che la gerarchia percorso come ho descritto è di per sé un figlio di un elemento chiamato applicazione, in modo l'intera struttura assomiglia a questo:

+0

@Nick Davis: È meglio aggiungere chiarimenti come questo alla domanda stessa (puoi sempre modificarlo). In un commento non hai formattazione e i dettagli potenzialmente importanti non sono visibili. – Tomalak

+0

Grazie per il suggerimento - Ho modificato la domanda originale con il mio commento. –

0

Personalmente preferisco RelaxNG su schema XML. Potrebbe valere il tuo tempo per provarlo.

+0

Perché? Puoi elaboare? – ChrisFletcher