XSD:具有相同元素的多个组

时间:2016-01-12 20:02:31

标签: php xml scope xsd multiple-definition-error

我正在尝试验证只能读取而不能更改的XML。我知道XML及其结构有什么可能,但不知道会收到什么。其中一些元素与其他元素具有相同的名称,要么完全相同,要么具有不同的类型等。

有没有办法从彼此的范围中删除组,或者我是否必须分离XML,单独验证块,等等?我提供了一个下面的尝试之一,以澄清我正在尝试的内容。

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:element name="root">
    <xs:complexType>
      <xs:sequence>
        <xs:element maxOccurs="8" minOccurs="8" name="request">
          <xs:complexType>
            <xs:choice maxOccurs="unbounded" minOccurs="1">
              <xs:group ref="group1"/>
              <xs:group ref="group2"/>
              <xs:group ref="group3"/>
            </xs:choice>
          </xs:complexType>
        </xs:element>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
  <xs:group name="group1">
    <xs:sequence>
      <xs:element name="hello" minOccurs="0" type="xs:string"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="group2">
    <xs:sequence>
      <xs:element name="hello" minOccurs="0" type="xs:string"/>
      <xs:element name="world" minOccurs="0" type="xs:string"/>
    </xs:sequence>
  </xs:group>
  <xs:group name="group3">
    <xs:sequence>
      <xs:element name="hello" minOccurs="0" type="xs:integer"/>
      <xs:element name="world" minOccurs="0" type="xs:boolean"/>
    </xs:sequence>
  </xs:group>
</xs:schema>

1 个答案:

答案 0 :(得分:3)

在特定情况下,您不能在单个内容模型中使用相同名称但类型不同的元素,request

您可以通过使group1group2group3实际上是XML中的元素而不仅仅是XSD中的组来解决此约束。

如果您无法更改XML,那么您已经采用了一种模棱两可的语法,XSD将无法帮助您进行验证,而不会比您更喜欢的更通用。例如,您可以使用xsd:any或概括world作为一种简单类型,可以适应所有情况 - xs:string可能有效。