xml - XML 的 XSD 验证失败
问题描述
我有一个 XML 文件,其内容如下
<?xml version="1.0" encoding="UTF-8"?>
<SETTINGS Version="1">
<CLEANING amount="40"/>
<CLEANING name="abcd"/>
<CLEANING initials="ABCD"/>
<MAINTENANCE state="on"/>
<MAINTENANCE temperature="F"/>
</SETTINGS>
我使用一些生成以下 XSD 输出的工具为此 XML 创建了 XSD 模式。
<?xml version="1.0" encoding="utf-8" ?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="SETTINGS">
<xs:complexType>
<xs:sequence>
<xs:element name="CLEANING" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="amount" type="xs:unsignedByte" use="required" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="initials" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
<xs:element name="MAINTENANCE" maxOccurs="unbounded">
<xs:complexType>
<xs:attribute name="state" type="xs:string" use="required" />
<xs:attribute name="temperature" type="xs:string" use="required" />
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="Version" type="xs:unsignedByte" use="required" />
</xs:complexType>
</xs:element>
</xs:schema>
现在,当我尝试针对生成的 XSD 模式验证此 XMl 时,我得到以下验证错误(使用某些在线验证器验证)。
Not valid.
Error - Line 3, 24: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 24; cvc-complex-type.4: Attribute 'name' must appear on element 'CLEANING'.
Error - Line 3, 24: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 24; cvc-complex-type.4: Attribute 'initials' must appear on element 'CLEANING'.
Error - Line 4, 24: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 24; cvc-complex-type.4: Attribute 'amount' must appear on element 'CLEANING'.
Error - Line 4, 24: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 24; cvc-complex-type.4: Attribute 'initials' must appear on element 'CLEANING'.
Error - Line 5, 28: org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 28; cvc-complex-type.4: Attribute 'amount' must appear on element 'CLEANING'.
Error - Line 5, 28: org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 28; cvc-complex-type.4: Attribute 'name' must appear on element 'CLEANING'.
Error - Line 6, 26: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 26; cvc-complex-type.4: Attribute 'temperature' must appear on element 'MAINTENANCE'.
Error - Line 7, 31: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 31; cvc-complex-type.4: Attribute 'state' must appear on element 'MAINTENANCE'.
XML 和 XSD 都是在线验证的有效格式。我无法理解此错误背后的原因。我怀疑这是因为有多个元素共享相同的名称,我认为在生成 XSD 架构时存在一些限制。不确定到底出了什么问题。
我在这里做错了什么,这个错误的解决方案是什么?
解决方案
<xs:complexType>
<xs:attribute name="amount" type="xs:unsignedByte" use="required" />
<xs:attribute name="name" type="xs:string" use="required" />
<xs:attribute name="initials" type="xs:string" use="required" />
</xs:complexType>
这个词
require
意味着需要该属性,因此您的 XML 的正确书写是:
<CLEANING amount="40" name="abcd" initials="ABCD"/>
如果你想让你写你需要删除require
你的 XSD
维护也是如此
您的 XSD 验证此文本:
<SETTINGS Version="1">
<CLEANING amount="40" name="abcd" initials="ABCD"/>
<MAINTENANCE state="on" temperature="F"/>
</SETTINGS>
但是如果你想用这种外观来验证你的 XML 是不可能的,use=require
所以你会有类似的东西:
...
<xs:complexType>
<xs:attribute name="amount" type="xs:unsignedByte" />
<xs:attribute name="name" type="xs:string" />
<xs:attribute name="initials" type="xs:string" />
</xs:complexType>
...
此外,如果你想要你的表格(所以<a att1 ="" /> <a att2="" />
)
您将需要像这样更改您的属性:
<SETTINGS Version="1">
<A amount="40" />
<B name="abcd" />
<C initials="ABCD"/>
<D state="on" />
<E temperature="F"/>
</SETTINGS>
但我认为最后的可能性可能对第一个选项有点过分
推荐阅读
- javascript - 如何使用 React 库将数据导出到 Excel
- c - 为什么这里会出现“被零除”?
- ios - 在 iPhone x 中添加额外高度的原生基础标题
- python - 使用 while 循环向用户询问非负整数
- react-native - 如何在 React Native 中更改 RTL 和 LTR
- python - 使用 Python/FFMPEG/Pydub 将 Wave 文件的部分静音
- javascript - 在 TypeScript 中测试对象分配
- javascript - 绝对定位元素未显示顶部 z-index
- java - 父类和子类之间的Spring使用。弹簧注射后设定值的问题
- node.js - 从外部模块导入类在 NodeJS 中不起作用