Опитвам се да разбера как да използвам 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);