Обнаружено недопустимое содержимое, начиная с элемента 'element'.На этом этапе не ожидается дочерний элемент - PullRequest
14 голосов
/ 18 февраля 2012

Я работаю над своими навыками XML, но валидатор ошибается в моем XSD в некоторых глубоко укоренившихся местах. Ошибки:

  • 18: 11 cvc-complex-type.2.4.d: обнаружен недопустимый контент, начиная с с элементом 'aktor'. В этот момент не ожидается дочерний элемент.
  • 37: 11 cvc-complex-type.2.4.d: Обнаружено недопустимое содержимое, начиная с
    с элементом 'utwor'. На этом этапе не ожидается дочерний элемент.

Вот 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>

Вот 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>

Я не понимаю проблему, она говорит, что дочерний элемент не ожидается, есть ли предел для дочернего номера? Могу ли я расширить его?

Я нашел ответ на мой вопрос, элементы, которые можно умножить, должны иметь атрибут maxOccurs = "unbounded".

Ответы [ 3 ]

14 голосов
/ 28 марта 2012

Я нашел ответ на свой вопрос, элементы, которые можно умножить, должны иметь атрибут maxOccurs = "unbounded".

2 голосов
/ 04 февраля 2014

Ответ, принятый на этот вопрос, действительно решит проблему, но не является «правильным» решением.

Причина добавления неограниченной работы заключается в том, что xsd теперь допускает несколько последовательностей, т.е.

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

То, что вы ДОЛЖНЫ сделать для решения проблемы, это добавить элементы последовательности к содержанию в правильном порядке, то есть что-то вроде этого:

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

, который даст вам:

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

т.е. только одна последовательность, и, следовательно, нет необходимости в неограниченном.

2 голосов
/ 23 января 2014

Просто добавив еще один ответ, поскольку принятый ответ не помог мне полностью.

Так что, если у вас есть структура, подобная задающему вопрос, вы не можете поместить maxOccurs="unbounded" во внешнююобертка элемента, поскольку он будет считаться глобальным элементом.

Вместо этого вы должны поместить его на все потенциальные элементы, например, так:

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

...