Подэлементы и пространства имен в XSD - PullRequest
1 голос
/ 22 июня 2009

Я пытался выяснить, как использовать 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>

Но теперь, используя встроенный Eclipse-валидатор (на основе Xerces?), Я получаю следующую ошибку:

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);

1 Ответ

1 голос
/ 22 июня 2009

Этот 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>
...