XML 配置文件验证

XML Validation for config file

我正在尝试为配置文件类型 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。我在这里做错了什么?我找到了 ,至少对我来说,我似乎出于我的目的正确地采用了它,但不知何故我的根对象配置没有定义。

您的 XML 架构中存在错误,因为 xs:element 不能同时具有 nametype 属性。

修复此问题后:由于您在 XML 架构中定义名称空间的方式,有效文档需要位于名称空间 https://www.w3schools.com 中。解决方案是 a) 修复您的 XML 文档以包含此命名空间(见上文),或 b) 将您的 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 架构的其他改进

由于嵌套过多,您的架构有点难以阅读。这是定义命名复杂类型的替代版本。此外,您的类型是 "mixed",而查看您的 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>