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
不能同时具有 name
和 type
属性。
修复此问题后:由于您在 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>
我正在尝试为配置文件类型 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
不能同时具有 name
和 type
属性。
修复此问题后:由于您在 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>