提问人:Paul π 提问时间:9/20/2023 更新时间:9/20/2023 访问量:49
XML 架构,多个元素具有相同的名称但具有不同的类型错误
xml schema, multiple elements with same name but with different types error
问:
网上有很多这种困境的例子,但我仍然不太明白解决这个问题的最佳方法。我正在尝试创建一个架构,该架构将:
- 检查特定元素顺序/顺序
- 每个元素都是必需的,仅出现 1 次,并且始终以相同的顺序列出。
- 确保元素限制仅适用于所述元素(包括属性名称和值)
- 只有一个元素具有,但多个元素具有 以及 。为了便于说明,下面的 XML 进行了简化。
type="System.Drawing.Size"
type="System.Boolean"
type="System.String"
- 有几个元素具有各自的限制枚举值。
type="System.String"
<val>
- 只有一个元素具有,但多个元素具有 以及 。为了便于说明,下面的 XML 进行了简化。
注意:我正在使用的XML结构使用“True”而不是“true”(即使“TruE”的混合大小写变体),因此我必须限制使用和枚举,而不是依赖.System.Boolean
base="xs:string"
xs:restriction base="xs:boolean"
在根据我目前拥有的架构验证以下xml时,我收到此错误消息:
cos-element-consistent: Error for type '#AnonType_Application.UserOptionsconfig'. Multiple elements with name 'option', with different types, appear in the model group.
XML格式:
<?xml version="1.0" encoding="utf-8"?>
<config>
<Application.UserOptions>
<option name="StartMaximized" type="System.Boolean">
<val>False</val>
</option>
<option name="WindowSize" type="System.Drawing.Size">
<val>1366, 768</val>
</option>
</Application.UserOptions>
</config>
XSD:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="config">
<xs:complexType>
<xs:sequence>
<xs:element name="Application.UserOptions">
<xs:complexType>
<xs:sequence>
<xs:element name="option">
<xs:complexType>
<xs:sequence>
<xs:element name="val">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="True"/>
<xs:enumeration value="False"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" fixed="StartMaximized"/>
<xs:attribute name="type" type="xs:string" use="required" fixed="System.Boolean"/>
</xs:complexType>
</xs:element>
<xs:element name="option">
<xs:complexType>
<xs:sequence>
<xs:element name="val">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="\d+,\s\d+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" fixed="WindowSize"/>
<xs:attribute name="type" type="xs:string" use="required" fixed="System.Drawing.Size"/>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
- 如何修复此架构,使其仍检查元素排序并强制执行我定义的限制?
- 针对 DTD 进行验证是否能实现我想要执行的操作,或者使用 XSD 是更好的方法?
我已经准备好接受社区的严厉语气,因为这个话题似乎已经被覆盖了,但在查看了与我类似的问题的回答后,我仍然无法确定如何纳入我列出的限制。
答:
0赞
Martin Honnen
9/20/2023
#1
示例 XSD 1.1 使用 基于以下属性:xs:alternative
type
option
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="config">
<xs:complexType>
<xs:sequence>
<xs:element name="Application.UserOptions">
<xs:complexType>
<xs:sequence>
<xs:element name="option" maxOccurs="unbounded">
<xs:alternative test="@type = 'System.Boolean'">
<xs:complexType>
<xs:sequence>
<xs:element name="val">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="True"/>
<xs:enumeration value="False"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" fixed="StartMaximized"/>
<xs:attribute name="type" type="xs:string" use="required" fixed="System.Boolean"/>
</xs:complexType>
</xs:alternative>
<xs:alternative test="@type = 'System.Drawing.Size'">
<xs:complexType>
<xs:sequence>
<xs:element name="val">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:pattern value="\d+,\s\d+"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
</xs:sequence>
<xs:attribute name="name" type="xs:string" use="required" fixed="WindowSize"/>
<xs:attribute name="type" type="xs:string" use="required" fixed="System.Drawing.Size"/>
</xs:complexType>
</xs:alternative>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
评论
xmllint --schema tmp.xsd --noout tmp.xml
org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 27; cos-element-consistent: Error for type '#AnonType_Application.UserOptionsconfig'. Multiple elements with name 'option', with different types, appear in the model group.[Ljava.lang.StackTraceElement;@38755291
option
Element Declarations Consistent