Под-елементи и пространства от имена в XSD

Опитвам се да разбера как да използвам XML схема за валидиране на XML файлове, докато ги зареждам в приложение. Тази част ми работи, но изглежда не мога да накарам схемата да разпознае нещо различно от основния елемент като валидно. Например, имам следния XML файл:

<fun xmlns="http://ttdi.us/I/am/having/fun"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://ttdi.us/I/am/having/fun
                          test.xsd">
    <activity>rowing</activity>
    <activity>eating</activity>
    <activity>coding</activity>
</fun>

със следния (вярно генериран от визуалния редактор — аз съм просто смъртен) XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun">
    <xsd:element name="fun" type="activityList"></xsd:element>

    <xsd:complexType name="activityList">
        <xsd:sequence>
            <xsd:element name="activity" type="xsd:string" maxOccurs="unbounded" minOccurs="0"></xsd:element>
        </xsd:sequence>
    </xsd:complexType>
</xsd:schema>

Но сега, използвайки вградения (базиран на Xerces?) валидатор на Eclipse, получавам следната грешка:

cvc-complex-type.2.4.a: Invalid content was found starting with element 'activity'. One of '{activity}' is expected.

И така, как да поправя своя XSD, така че да... работи? Всички резултати от търсенето, които съм виждал досега, изглежда казват "...така че току-що изключих проверката" или "...така че току-що се отървах от пространствата от имена" и това не е нещо, което искам да направя.

ДОПЪЛНЕНИЕ:

Сега да кажем, че променя схемата си на тази:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun">
    <xsd:element name="activity" type="xsd:string"></xsd:element>

    <xsd:element name="fun">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="activity" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

Сега работи, но този метод означава ли, че ми е позволено да имам <actvity> в основата на моя документ? И ако ref трябва просто да бъде заменен такъв, какъвто е, тогава защо не мога да заменя ref="actvity" с name="activity" type="xsd:string"?

ДОПЪЛНИТЕЛНО ДОПЪЛНЕНИЕ: ВИНАГИ правете това, в противен случай ще прекарате часове и часове, удряйки главата си в стената:

DocumentBuilderFactory dbf;
// initialize dbf
dbf.setNamespaceAware(true);

person Paul Fisher    schedule 22.06.2009    source източник


Отговори (1)


Този XSD валидира правилно тук:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema targetNamespace="http://ttdi.us/I/am/having/fun" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://ttdi.us/I/am/having/fun">

  <!-- definition of simple element(s) -->
  <xsd:element name="activity" type="xsd:string"></xsd:element>

  <!-- definition of complex element(s) -->
  <xsd:element name="fun">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="activity" maxOccurs="unbounded" minOccurs="0"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>

</xsd:schema>
person mechanical_meat    schedule 22.06.2009
comment
така че поставянето на всички тези елементи в корена на документа правилното/прието нещо ли е? Просто изглежда малко смешно на пръв поглед. - person Paul Fisher; 22.06.2009
comment
Можете също толкова лесно да посочите елемента „activity“ вътре в елемента „fun“ (вместо да използвате атрибута „ref“): ‹xsd:element name=activity type=xsd:string maxOccurs=unbounded minOccurs=0/› Въпреки това , ако вашата схема стане по-сложна, може да предпочетете да разделите дефинициите, както по-горе. И двата метода са правилни/приети. - person mechanical_meat; 22.06.2009
comment
Но след това, ако направя това, което предлагате в този коментар, той отново се поврежда със същото съобщение за грешка, както преди. Напълно съм озадачен. и имам чувството, че пропускам нещо основно. - person Paul Fisher; 23.06.2009
comment
Добавете elementFormDefault=qualified към вашия елемент от схемата (‹xsd:schema ...›) и трябва да сте готови. - person mechanical_meat; 23.06.2009
comment
Г-н Берние: ЕДИН (1) ИНТЕРНЕТ ЗА ВАС. - person Paul Fisher; 23.06.2009
comment
За да отговоря на другия ви въпрос: XML документ с елемент „активност“ в основата НЕ би валидиран спрямо моя XSD. Освен това вашият 2-ри XSD има малка правописна грешка: ref=activity трябва да бъде name=activity - person mechanical_meat; 23.06.2009
comment
Оказва се, че този и други свързани проблеми се дължат (поне отчасти) на факта, че не бях активирал поддръжката на пространство от имена в моя анализатор, което направи нещата наистина много трудни. - person Paul Fisher; 23.06.2009