web-dev-qa-db-fra.com

Un contenu non valide a été trouvé en commençant par l'élément 'element'. Aucun élément enfant n'est attendu à ce stade

Je travaille sur mes compétences xml, mais le validateur erreur mon XSD à certains endroits profondément enracinés. Les erorrs sont:

  • 18: 11 cvc-complex-type.2.4.d: Un contenu non valide a été trouvé en commençant par l'élément 'aktor'. Aucun élément enfant n'est attendu à ce stade.
  • 37: 11 cvc-complex-type.2.4.d: un contenu non valide a été trouvé à partir de
    avec l'élément 'utwor'. Aucun élément enfant n'est attendu à ce stade.

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

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

Je ne comprends pas le problème, il dit qu'aucun élément enfant n'est attendu, y a-t-il une limite pour le nombre d'enfants? Puis-je l'agrandir?

J'ai trouvé la réponse à ma question, les éléments qui pourraient être multipliés, doivent avoir l'attribut maxOccurs = "illimité".

14
Malyo

J'ai trouvé la réponse à ma question, les éléments qui pourraient être multipliés, doivent avoir l'attribut maxOccurs = "illimité".

14
Malyo

La réponse acceptée pour cette question, va certes résoudre le problème, mais n'est pas la "bonne" solution.

La raison, en ajoutant des travaux sans limites, est que le xsd autorise désormais plusieurs séquences, c'est-à-dire.

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

Ce que vous DEVRIEZ faire pour résoudre le problème, c'est ajouter les éléments de la séquence, au contenu, dans le bon ordre, c'est-à-dire quelque chose comme ceci:

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

ce qui vous donnera:

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

c'est-à-dire UNE SEULE séquence, et donc pas besoin de sans limite.

2
dortique

Ajouter simplement une autre réponse ici car la réponse acceptée ne m'a pas complètement aidé.

Donc, si vous avez une structure comme celle qui pose la question ici, vous ne pouvez pas mettre le maxOccurs="unbounded" sur le wrapper d'élément le plus externe car il sera considéré comme un élément global.

Vous devez plutôt le mettre sur tous les éléments potentiels comme ceci:

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