xs: выбор неограниченного списка - PullRequest
4 голосов
/ 07 апреля 2010

Я хочу определить схему XSD для документа XML, пример ниже:

<?xml version="1.0" encoding="utf-8"?>
<view xmlns="http://localhost/model_data" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://localhost/model_data XMLSchemaView.xsd" path="wibble" id="wibble">
    <text name="PageTitle">Homepage</text>
    <text name="Keywords">home foo bar</text>
    <image name="MainImage">
        <description>lolem ipsum</description>
        <title>i haz it</title>
        <url>/images/main-image.jpg</url>
        <type>image/jpeg</type>
        <alt>alt text for image</alt>
        <width>400</width>
        <height>300</height>
    </image>
    <link name="TermsAndConditionsLink">
        <url>/tnc.html</url>
        <title>Terms and Conditions</title>
        <target>_blank</target>
    </link>
</view>

Существует корневой элемент представления, а затем неизвестное количество элементов поля (различных типов). Я использую следующую схему XSD:

<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://localhost/model_data" targetNamespace="http://localhost/model_data" id="XMLSchema1">
    <xs:element name="view" type="model_data"/>
    <xs:complexType name="model_data">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="text" type="text_field"/>
            <xs:element name="image" type="image_field"/>
            <xs:element name="link" type="link_field"/>
        </xs:choice>
        <xs:attribute name="path" type="xs:string"/>
        <xs:attribute name="id" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="image_field">
        <xs:all>
            <xs:element name="description" type="xs:string"/>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="type" type="xs:string"/>
            <xs:element name="url" type="xs:string"/>
            <xs:element name="alt" type="xs:string"/>
            <xs:element name="height" type="xs:int"/>
            <xs:element name="width" type="xs:int"/>
        </xs:all>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
    <xs:complexType name="text_field">
        <xs:simpleContent>
            <xs:extension base="xs:string">
                <xs:attribute name="name" type="xs:string"/>
            </xs:extension>
        </xs:simpleContent>
    </xs:complexType>
    <xs:complexType name="link_field">
        <xs:all>
            <xs:element name="target" type="xs:string"/>
            <xs:element name="title" type="xs:string"/>
            <xs:element name="url" type="xs:string"/>
        </xs:all>
        <xs:attribute name="name" type="xs:string"/>
    </xs:complexType>
</xs:schema>

Похоже, это должно работать для меня, но это не так, и я всегда получаю следующую ошибку:

Element <text> is not allowed under element <view>.
Reason: The following elements are expected at this location (see below)
    <text>
    <image>
    <link>
Error location: view / text
Details
    cvc-model-group: Element <text> unexpected by type 'model_data' of element <view>.
    cvc-elt.5.2.1: The element <view> is not valid with respect to the actual type definition 'model_data'.

Я никогда раньше не использовал схемы XSD, поэтому я был бы очень признателен, если бы кто-то мог указать, где я ошибаюсь.

Ответы [ 2 ]

3 голосов
/ 07 апреля 2010

ОБНОВЛЕНИЕ:

Я думаю, что нашел проблему - вот это утверждение здесь:

<view 
      xmlns="http://localhost/model_data" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 ==>  xsi:schemaLocation="http://localhost/model_data XMLSchemaView.xsd"  <====
      path="wibble" id="wibble">

Вы, похоже, ссылаетесь на местоположение на вашем локальном хосте здесь, ссылаясь на XSD-файл - это действительно так ???

Если я удаляю эту одну строку из XML, все проверяется очень хорошо.

Это еще один остаток от некоторых испытаний ??

0 голосов
/ 07 апреля 2010

У вас есть умножение имен, таких как 'text' (в разделе 'model_data', а также в схеме). Просто поменяй одну из них.

...