Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php XSD:具有相同元素的多个组_Php_Xml_Scope_Xsd_Multiple Definition Error - Fatal编程技术网

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

Php XSD:具有相同元素的多个组,php,xml,scope,xsd,multiple-definition-error,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/X

我试图验证只能读取而不能更改的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>

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

您可以通过使
group1
group2
group3
实际上成为XML中的元素,而不仅仅是XSD中的组来绕过此限制


如果您不能更改XML,那么您就采用了一种不明确的语法,XSD将无法帮助您进行验证,除非您可能更愿意使用这种语法。例如,您可以使用
xsd:any
或将
world
概括为一个简单的类型,可以适应所有情况--
xs:string
可能会起作用。

请解释这句话:我知道XML及其结构中可能存在什么,但不知道将接收什么我知道组1、2和3是什么样子,但我不知道它们的顺序是什么,它们是否会多次出现在那里,或者它们是否会出现在那里。请显示一个无法更改的XML文档示例。顺便问一下,你为什么用PHP标记这个问题?@MathiasMüller:我用PHP标记这个问题,因为我在PHP中使用schemaValidateSource()进行验证。我担心PHP还没有解决这个问题的方法,你是对的,我无法更改XML。谢谢你花时间回复。@dabuda:不客气。请注意,该问题存在于XML/XSD级别,与PHP或任何其他实现无关。