2012-02-18 24 views
14

Estoy trabajando en mis habilidades xml, pero el validador falla mi XSD en ciertos lugares profundamente enraizados. Los erorrs son:El contenido no válido se encontró comenzando por el elemento 'elemento'. No se espera ningún elemento hijo en este punto

  • 18: 11 CVC-complejo-type.2.4.d: se encontró contenido no válido a partir con el elemento 'aktor'. No se espera ningún elemento hijo en este punto.
  • 37: 11 cvc-complex-type.2.4.d: Se encontró contenido inválido a partir de
    con el elemento 'utwor'. No se espera ningún elemento hijo en este punto.

Aquí es XSD:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="filmy"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="film"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element name="tytul"/> 
         <xs:element name="gatunek"/> 
         <xs:element name="czasTrwania"/> 
         <xs:element name="premiera"/> 
         <xs:element name="produkcja"/> 
         <xs:element name="rezyser"/> 
         <xs:element name="scenariusz"/> 

         <xs:element name="obsada"> 
          <xs:complexType> 
           <xs:sequence> 
            <xs:element name="aktor"> 
             <xs:complexType> 
              <xs:sequence> 
               <xs:element name="imie"/> 
               <xs:element name="nazwisko"/> 
               <xs:element name="dataUrodzenia"/> 
               <xs:element name="postac"/> 
              </xs:sequence> 
             </xs:complexType> 
            </xs:element> 
           </xs:sequence> 
          </xs:complexType> 
         </xs:element> 

         <xs:element name="soundtrack"> 
          <xs:complexType> 
           <xs:sequence> 
            <xs:element name="utwor"> 
             <xs:complexType> 
              <xs:sequence> 
               <xs:element name="wykonawca"/> 
               <xs:element name="tytulUtworu"/> 
               <xs:element name="gatunekMuzyczny"/> 
              </xs:sequence> 
             </xs:complexType> 
            </xs:element> 
           </xs:sequence> 
          </xs:complexType> 
         </xs:element> 
        </xs:sequence> 
       </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
    </xs:complexType> 
</xs:element> 

</xs:schema> 

Aquí es XML:

<?xml version="1.0" encoding="utf-8"?> 
<filmy xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <film> 
     <tytul>Fight Club</tytul> 
     <gatunek>Thriller, Psychologiczny</gatunek> 
     <czasTrwania>2h11m</czasTrwania> 
     <premiera>11 luty 1999</premiera> 
     <produkcja>Niemcy, USA</produkcja> 
     <rezyser>David Fincher</rezyser> 
     <scenariusz>Jim Uhls</scenariusz> 
     <obsada> 
      <aktor> 
       <imie>Edward</imie> 
       <nazwisko>Norton</nazwisko> 
       <dataUrodzenia>1969</dataUrodzenia> 
       <postac>Narrator</postac> 
      </aktor> 
      <aktor> 
       <imie>Brad</imie> 
       <nazwisko>Pitt</nazwisko> 
       <dataUrodzenia>1963</dataUrodzenia> 
       <postac>Tyler Durden</postac> 
      </aktor> 
      <aktor> 
       <imie>Helena</imie> 
       <nazwisko>Boham Carter</nazwisko> 
       <dataUrodzenia>1966</dataUrodzenia> 
       <postac>Marla Singer</postac> 
      </aktor> 
     </obsada> 
     <soundtrack> 
      <utwor> 
       <wykonawca>The Pixies</wykonawca> 
       <tytulUtworu>Where is my mind</tytulUtworu> 
       <gatunekMuzyczny>Rock</gatunekMuzyczny> 
      </utwor> 
      <utwor> 
       <wykonawca>The Pixies</wykonawca> 
       <tytulUtworu>Where is my mind</tytulUtworu> 
       <gatunekMuzyczny>Rock</gatunekMuzyczny> 
      </utwor> 
      <utwor> 
       <wykonawca>The Pixies</wykonawca> 
       <tytulUtworu>Where is my mind</tytulUtworu> 
       <gatunekMuzyczny>Rock</gatunekMuzyczny> 
      </utwor> 
     </soundtrack> 
    </film> 
</filmy> 

No entiendo el problema, se dice que se espera ningún elemento hijo, ¿hay un límite para el número de niños? ¿Puedo expandirlo?

He encontrado la respuesta a mi pregunta, los elementos que se pueden multiplicar, tienen que tener el atributo maxOccurs = "ilimitado".

+1

Debe publicar la solución como una respuesta, luego esperar 48 horas y "aceptar" su propia respuesta. Esto marcará la pregunta respondida, con la solución correcta, para futuros usuarios. No obtendrá ningún punto, pero mejorará el sitio –

+0

En realidad obtendrá 2 puntos por marcar una respuesta. –

Respuesta

14

He encontrado la respuesta a mi pregunta, los elementos que se pueden multiplicar, tienen que tener el atributo maxOccurs = "ilimitado".

2

Simplemente agregando otra respuesta aquí como la aceptada no me ayudó por completo.

Así que si tiene una estructura como la pregunta asker aquí, no puede poner maxOccurs="unbounded" en la envoltura más externa del elemento ya que se considerará un elemento global.

Tienes que ponerlo en su lugar sobre todos los elementos posibles de esta manera:

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"> 

<xs:element name="filmy"> 
    <xs:complexType> 
     <xs:sequence> 
      <xs:element name="film"> 
       <xs:complexType> 
        <xs:sequence> 
         <xs:element maxOccurs="unbounded" name="tytul"/> 
         <xs:element maxOccurs="unbounded" name="gatunek"/> 
         <xs:element maxOccurs="unbounded" name="czasTrwania"/> 
         <xs:element maxOccurs="unbounded" name="premiera"/> 
         <xs:element maxOccurs="unbounded" name="produkcja"/> 
         <xs:element maxOccurs="unbounded" name="rezyser"/> 
         <xs:element maxOccurs="unbounded" name="scenariusz"/> 

... etc

2

La respuesta aceptada para esta pregunta, de hecho va a resolver el problema, pero no es el solución "correcta".

La razón, añadiendo sin límites, obras, es que el xsd ahora permiten múltiples secuencias, es decir

<filmy> 
    <sequence> 
     <element_3> 
    </sequence> 
    <sequence> 
     <element_2> 
    <sequence> 
    <sequence> 
     <element_1> 
    <sequence> 
    </filmy> 

lo que debe hacer para resolver el problema, es añadir los elementos de la secuencia, con el contenido, en el orden correcto, es decir algo como esto:

filmy.getContent().add(element1) 
    filmy.getContent().add(element2) 
    filmy.getContent().add(element3) 

que le dará:

<filmy> 
    <sequence> 
     <element_1> 
     <element_2> 
     <element_3> 
    <sequence> 
    </filmy> 

, es decir, solo UNA secuencia, y por lo tanto no es necesario que esté sin límites.

Cuestiones relacionadas