2011-03-02 7 views
6

Tengo una comprensión elemental de XML Schema. Esta es básicamente mi primera interacción con ellos de manera seria y tengo algunos problemas. He leído en XSD en google y todo se ve al alza y hacia arriba con este archivo.¿Hay algo radicalmente incorrecto con este esquema XML?

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

    <xs:element name="credits"> 
    <xs:complexType> 
     <xs:sequence> 
     <xs:element ref="property" maxOccurs="16" minOccurs="13" /> 
     </xs:sequence> 
    </xs:complexType> 
    </xs:element> 

    <xs:element name="property" type="xs:string">  
    <xs:complexType>   
     <xs:sequence>    
      <xs:element ref="item" minOccurs="1" maxOccurs="unbounded" /> 
     </xs:sequence> 
     <xs:attribute ref="name" use="required"/> 
    </xs:complexType> 

    </xs:element> 

    <xs:element name="item" type="xs:string"/> 

    <xs:attribute name="name" type="xs:string"> 
     <xs:simpleType> 
     <xs:restriction base="xs:string"> 
      <xs:enumeration value="example1"/> 
      <xs:enumeration value="example2"/> 
      <xs:enumeration value="example3"/> 
      <xs:enumeration value="example4"/> 
      <xs:enumeration value="example5"/> 
      <xs:enumeration value="example6"/> 
      <xs:enumeration value="example7"/> 
      <xs:enumeration value="example8"/> 
      <xs:enumeration value="example9"/> 
      <xs:enumeration value="example10"/> 
      <xs:enumeration value="example11"/> 
      <xs:enumeration value="example12"/> 
      <xs:enumeration value="example13"/> 
      <xs:enumeration value="example14"/> 
      <xs:enumeration value="example15"/> 
      <xs:enumeration value="example16"/> 
     </xs:restriction> 
     </xs:simpleType> 
    </xs:attribute> 

</xs:schema> 

Así es como estoy cargarlo:

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schemaXSD = schemaFactory.newSchema(new File ("test.xsd")); 

Estoy recibiendo una excepción como la siguiente:

org.xml.sax.SAXParseException: src-element.3: El elemento 'propiedad' tiene tanto un atributo 'tipo' como un 'anony mous type 'niño. Solo uno de está permitido para un elemento.

Gracias por la ayuda SO! ¡También se agradece cualquier consejo general sobre leer/usar esquemas creados por otros! : D

+0

Hay una serie de entornos de desarrollo que puede detectar este tipo de error en el momento de la edición (es decir, antes de enviar el XSD a su propio código). [eclipse J2E] (http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/heliossr1), por ejemplo, mostrará pequeños marcadores rojos en el margen derecho con los mismos mensajes de error que citó)) –

Respuesta

5

Este bit es su código de problema:

<xs:element name="property" type="xs:string">  
    <xs:complexType>   
     <xs:sequence>    
      <xs:element ref="item" minOccurs="1" maxOccurs="unbounded" /> 
     </xs:sequence> 
     <xs:attribute ref="name" use="required"/> 
    </xs:complexType> 

    </xs:element> 

o bien quitar el tipo en el elemento exterior (type="xs:string"), o retirar el elemento complexType interna anónima (<xs:complexType> ... </xs:complexType>)

+2

Esto probablemente también aparezca en el próximo bit de código. . Tienes dos declaraciones de tipo, y el sistema no sabrá cuál usar. – blueberryfields

+0

entonces, ¿cómo va a decir que el elemento tiene un atributo sin el uso de completype? – Ashwin

6

Elemento 'propiedad' tiene tanto un atributo 'tipo' y un niño 'tipo anónimo'

En otras palabras, es decir type="xs:string" y esto prescribe como nodos <property>foo</property>. Pero también pones un ComplexType item dentro del property, y esto prescribe nodos como <property><item>...</item></property>. Esta es la contradicción que el analizador considera un error.

Si desea almacenar un número de item s en cada property y una cadena separada por property, almacenar esta cadena como nodo separado, ya sea un niño con una etiqueta o un atributo de property. P.ej. <property mystring="foo"><item>...</item></property>

+0

, entonces, ¿cómo va a decir que el elemento tiene un atributo sin el uso de completype? Pensé que un atributo tiene un elemento que debe entrar dentro del complexType. – Ashwin

Cuestiones relacionadas