XML 架构,多个元素具有相同的名称但具有不同的类型错误

xml schema, multiple elements with same name but with different types error

提问人:Paul π 提问时间:9/20/2023 更新时间:9/20/2023 访问量:49

问:

网上有很多这种困境的例子,但我仍然不太明白解决这个问题的最佳方法。我正在尝试创建一个架构,该架构将:

  • 检查特定元素顺序/顺序
    • 每个元素都是必需的,仅出现 1 次,并且始终以相同的顺序列出。
  • 确保元素限制仅适用于所述元素(包括属性名称和值)
    • 只有一个元素具有,但多个元素具有 以及 。为了便于说明,下面的 XML 进行了简化。type="System.Drawing.Size"type="System.Boolean"type="System.String"
    • 有几个元素具有各自的限制枚举值。type="System.String"<val>


注意:我正在使用的XML结构使用“True”而不是“true”(即使“TruE”的混合大小写变体),因此我必须限制使用和枚举,而不是依赖.System.Booleanbase="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 是更好的方法?



我已经准备好接受社区的严厉语气,因为这个话题似乎已经被覆盖了,但在查看了与我类似的问题的回答后,我仍然无法确定如何纳入我列出的限制。

XML XSD DTD XML 验证

评论

0赞 LMC 9/20/2023
您如何执行验证?它的工作方式与按原样提供的示例一样进行验证。xmllint --schema tmp.xsd --noout tmp.xml
0赞 Paul π 9/20/2023
到目前为止,我已经使用了 freeformatter.com/xml-validator-xsd.htmlliquid-technologies.com/online-xsd-validator
0赞 LMC 9/20/2023
奇怪。它在这里有效,在这里无效: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
2赞 Michael Kay 9/20/2023
首先要做出的决定是:您的技术限制是什么。你能使用 XSD 1.1 吗?你能使用 XSD 1.0 + Schematron 吗?你能使用Relax NG吗?(我没有提到 DTD,因为它们会让你无处可去)。纯 XSD 1.0 解决方案是不可能的。
1赞 Martin Honnen 9/20/2023
我不认为你想要的方式是可能的,你不能有两个不同类型的 s,除非可能使用 XSD 1.1 和条件类型。option
2赞 Michael Kay 9/20/2023
我要补充一点,该模式肯定是无效的(违反了约束)。任何接受它的 XSD 处理器都不符合规范。当然,不合规并不意味着它无法使用,但这意味着你要冒很大的风险。Element Declarations Consistent

答:

0赞 Martin Honnen 9/20/2023 #1

示例 XSD 1.1 使用 基于以下属性:xs:alternativetypeoption

<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>