XML Проверка для файла конфигурации - PullRequest
2 голосов
/ 06 марта 2020

Я пытаюсь получить схему XML для типа файла конфигурации XML работает.

Вот что я получил:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="https://www.w3schools.com" 
    xmlns="https://www.w3schools.com" elementFormDefault="qualified">

    <xs:element name="config" type="config">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:element name="module" maxOccurs="unbounded">
                    <xs:complexType mixed="true">
                        <xs:sequence>
                            <xs:element name="parameter" maxOccurs="unbounded">
                                <xs:complexType mixed="true">
                                    <xs:attribute name="name" type="xs:string" use="required"/>
                                    <xs:attribute name="description" type="xs:string" />
                                    <xs:attribute name="type" type="xs:string" use="required"/>
                                    <xs:attribute name="value" type="xs:string" use="required"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="name" type="xs:string" use="required" />
                        <xs:attribute name="description" type="xs:string" />
                        <xs:attribute name="version" type="xs:string" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Пример файла, который должен быть допустимым :

<config>
    <module name="module1">
        <parameter name="param1" value="1.234" type="float"/>
    </module>
    <module name="module2">
        <parameter name="param1" value="Hello there!" type="string"/>
        <parameter name="param2" value="3.1415" type="float"/>
    </module>
</config>

Но я получаю ошибку Cvc-elt.1.a: Cannot Find The Declaration Of Element config. Что я тут не так сделал? Я нашел этот ответ и, по крайней мере, мне кажется, что я правильно принял его для своих целей, но каким-то образом моя root конфигурация объекта не определена.

1 Ответ

3 голосов
/ 06 марта 2020

В вашей схеме XML есть ошибка, поскольку xs:element не может иметь атрибуты name и type.

После исправления: из-за того, как вы определили пространства имен в XML Схема, допустимый документ должен находиться в пространстве имен https://www.w3schools.com. Решение состоит в том, чтобы а) либо исправить документ XML, чтобы включить это пространство имен (см. Выше), либо б) изменить XSD, чтобы он не ожидал пространства имен.

исправление документа XML ( без изменений XML схема)

Это будет действительный документ:

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="https://www.w3schools.com">
    <module name="module1">
        <parameter name="param1" value="1.234" type="float"/>
    </module>
    <module name="module2">
        <parameter name="param1" value="Hello there!" type="string"/>
        <parameter name="param2" value="3.1415" type="float"/>
    </module>
</config>

XML Схема, которая не ожидает пространства имен (без изменений к XML документу

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

    <xs:element name="config">
        <xs:complexType mixed="true">
            <xs:sequence>
                <xs:element name="module" maxOccurs="unbounded">
                    <xs:complexType mixed="true">
                        <xs:sequence>
                            <xs:element name="parameter" maxOccurs="unbounded">
                                <xs:complexType mixed="true">
                                    <xs:attribute name="name" type="xs:string" use="required"/>
                                    <xs:attribute name="description" type="xs:string" />
                                    <xs:attribute name="type" type="xs:string" use="required"/>
                                    <xs:attribute name="value" type="xs:string" use="required"/>
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>
                        <xs:attribute name="name" type="xs:string" use="required" />
                        <xs:attribute name="description" type="xs:string" />
                        <xs:attribute name="version" type="xs:string" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

Другие улучшения вашей XML схемы

Ваша схема немного сложна для чтения из-за тяжелого вложения. Вот альтернативная версия, которая определяет именованные сложные типы. Кроме того, ваши типы «смешаны», тогда как, глядя на ваш XML документ, я не думаю, что они должны быть.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="unqualified">

    <xs:element name="config" type="configType" />

    <xs:complexType name="configType">
        <xs:sequence>
            <xs:element name="module" type="moduleType" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="moduleType">
        <xs:sequence>
            <xs:element name="parameter" type="parameterType" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="description" type="xs:string" />
        <xs:attribute name="version" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="parameterType">
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="description" type="xs:string" />
        <xs:attribute name="type" type="xs:string" use="required"/>
        <xs:attribute name="value" type="xs:string" use="required"/>
    </xs:complexType>

</xs:schema>

Редактировать: вводить другое пользовательское пространство имен

XML Документ

<?xml version="1.0" encoding="UTF-8"?>
<config xmlns="https://www.myowndomain.com">
    <module name="module1">
        <parameter name="param1" value="1.234" type="float"/>
    </module>
    <module name="module2">
        <parameter name="param1" value="Hello there!" type="string"/>
        <parameter name="param2" value="3.1415" type="float"/>
    </module>
</config>

XML Схема

В схеме вы удалите все ссылки на w3schools.com и замените их своим URI пространства имен.

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified"
    targetNamespace="https://www.myowndomain.com" xmlns="https://www.myowndomain.com">

    <xs:element name="config" type="configType" />

    <xs:complexType name="configType">
        <xs:sequence>
            <xs:element name="module" type="moduleType" maxOccurs="unbounded" />
        </xs:sequence>
    </xs:complexType>

    <xs:complexType name="moduleType">
        <xs:sequence>
            <xs:element name="parameter" type="parameterType" maxOccurs="unbounded" />
        </xs:sequence>
        <xs:attribute name="name" type="xs:string" use="required" />
        <xs:attribute name="description" type="xs:string" />
        <xs:attribute name="version" type="xs:string" />
    </xs:complexType>

    <xs:complexType name="parameterType">
        <xs:attribute name="name" type="xs:string" use="required"/>
        <xs:attribute name="description" type="xs:string" />
        <xs:attribute name="type" type="xs:string" use="required"/>
        <xs:attribute name="value" type="xs:string" use="required"/>
    </xs:complexType>

</xs:schema>
...