xml架构xsd任何元素

时间:2016-03-03 00:50:31

标签: xml validation xsd

我正在尝试编写一个模式,该模式将使用以下结构验证XML文档:

<?xml version="1.0" encoding="UTF-8"?>
<RootElement>
  <Group1>
    <Group1Member1 value="true"/>
    <Group1Member2 value="false"/>
    <Group1Member3 value="true"/>
  </Group1>
  <Group2>
    <Group2Member1 source="INA"/>
    <Group2Member2 source="INB"/>
    <Group2Member3 source="INC"/>
    <Group2Member4 source="IND"/>
  </Group2>
  <Group3>
    <Group3Member1 source="INY"/>
    <Group3Member2 source="INZ"/>
  </Group3>
  <Group4>
    <Group4Member device="D1" maxTemp="100" hysteresis="5" />
    <Group4Member device="D2" maxTemp="120" hysteresis="2" />
    <Group4Member device="D3" maxTemp="50" hysteresis="1" />
  </Group4>
<RootElement>

问题在于:

  • Group1,Group2,Group3和Group4是可选的,可以按任意顺序出现0次或一次
  • 每个组的成员元素可以按任何顺序出现
  • 在Group4中,Group4Member可能会出现0到4次(含)
  • 此处未显示的任意数量的任意元素可能出现在RootElement或任何组中的任何位置 - 它们和身体中的任何内容都将被忽略
  • 必须忽略任何已知元素中的未知属性

我已经整理了以下XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="RootElement">
    <xs:complexType>
      <xs:all>
        <xs:element name="Group1" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="Group1Member1" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="value" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="true" />
                        <xs:enumeration value="false" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
              <xs:element name="Group1Member2" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="value" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="true" />
                        <xs:enumeration value="false" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
              <xs:element name="Group1Member3" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="value" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="true" />
                        <xs:enumeration value="false" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="Group2" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="Group2Member1" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="source" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="INA" />
                        <xs:enumeration value="INB" />
                        <xs:enumeration value="INC" />
                        <xs:enumeration value="IND" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
              <xs:element name="Group2Member2" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="source" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="INA" />
                        <xs:enumeration value="INB" />
                        <xs:enumeration value="INC" />
                        <xs:enumeration value="IND" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
              <xs:element name="Group2Member3" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="source" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="INA" />
                        <xs:enumeration value="INB" />
                        <xs:enumeration value="INC" />
                        <xs:enumeration value="IND" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
              <xs:element name="Group2Member4" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="source" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="INA" />
                        <xs:enumeration value="INB" />
                        <xs:enumeration value="INC" />
                        <xs:enumeration value="IND" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="Group3" maxOccurs="1">
          <xs:complexType>
            <xs:all>
              <xs:element name="Group3Member1" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="source" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="INY" />
                        <xs:enumeration value="INZ" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
              <xs:element name="Group3Member2" maxOccurs="1">
                <xs:complexType>
                  <xs:attribute name="source" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="INY" />
                        <xs:enumeration value="INZ" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
            </xs:all>
          </xs:complexType>
        </xs:element>
        <xs:element name="Group4" maxOccurs="1">
          <xs:complexType>
            <xs:sequence>
              <xs:element name="Group4Member" maxOccurs="4">
                <xs:complexType>
                  <xs:attribute name="device" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:string">
                        <xs:enumeration value="D1" />
                        <xs:enumeration value="D2" />
                        <xs:enumeration value="D3" />
                        <xs:enumeration value="D4" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                  <xs:attribute name="maxTemp" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:integer">
                        <xs:minInclusive value="0" />
                        <xs:maxInclusive value="255" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                  <xs:attribute name="hysteresis" use="required">
                    <xs:simpleType>
                      <xs:restriction base="xs:integer">
                        <xs:minInclusive value="0" />
                        <xs:maxInclusive value="255" />
                      </xs:restriction>
                    </xs:simpleType>
                  </xs:attribute>
                </xs:complexType>
              </xs:element>
            </xs:sequence>
          </xs:complexType>
        </xs:element>
      </xs:all>
    </xs:complexType>
  </xs:element>
</xs:schema>

“xmllint”对没有未知标签或属性的文档感到满意。

当我添加“&lt; xs:any processContents =”时,跳过“minOccurs =”0“&gt;”就在“&lt; / xs:sequence&gt;”之前和“&lt; / xs:all&gt;”标签,架构不再标记额外(超过4)或无效(坏属性值)“&lt; Group4Member&gt;”元素为错误。

我可能做了一些愚蠢的事情,而且有可能有人能够轻松查明我的问题,所以我在这里问。

我还没有尝试过anyAttribute,我想我最终会到达那里。另外,有没有办法让“&lt; xs:all&gt;”组允许0或更多(不是0或1)出现任何成员元素?

感谢您的耐心等待,并提前寻求帮助。

1 个答案:

答案 0 :(得分:0)

将namespace属性添加到xs:any标记,其值为## other或## local。这样可以避免在您自己的命名空间中出现未经检查的标记。