Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.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
能够定义expect多个值的PHP XML解析器_Php_Xml_Xsd_Wsdl_Dtd - Fatal编程技术网

能够定义expect多个值的PHP XML解析器

能够定义expect多个值的PHP XML解析器,php,xml,xsd,wsdl,dtd,Php,Xml,Xsd,Wsdl,Dtd,我们必须编写读取器来定期输入xml数据,我们遇到的一个常见错误是,如果您有一个节点可以有多个子节点,并且在一个特定实例中只有一个子节点,那么结果数组或对象将返回单个子节点,而不是子节点数组 例如,解析: <parent> <child name="Bill"> </child> <child name="John"> </child> </parent> 鉴于解析: <parent> <

我们必须编写读取器来定期输入xml数据,我们遇到的一个常见错误是,如果您有一个节点可以有多个子节点,并且在一个特定实例中只有一个子节点,那么结果数组或对象将返回单个子节点,而不是子节点数组

例如,解析:

<parent>
  <child name="Bill">
  </child>
  <child name="John">
  </child>
</parent>
鉴于解析:

<parent>
  <child name="John">
  </child>
</parent>
我知道,根据具体情况,我们可以手动检查这些内容,如:

if(isset($parent['child']['name'])$parent['child']=array($parent['child'])

但这是你必须时刻记住要做的事情,而且它经常出现在bug报告中。许多xml源已经有WSDL规范或DTD,它们确实指定了一个元素可能有多次出现,如下所示,因此我们需要的信息已经存在,但我们使用的解析器似乎都不够聪明,无法在构建结果时使用这些信息

<s:complexType name="parent">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="child" nillable="true" type="tns:child"/>
</s:sequence>
</s:complexType>
<s:complexType name="child">
<s:complexContent mixed="false">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="name" type="s:string"/>
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>

是否有一个xml解析器可以更智能地解释数据,它知道何时一组元素是基于DTD、XSD、WSDL的列表,并且总是返回一个值数组,而不是使用最佳猜测来折叠单个值,或者是否可以将解析器设置为总是将每个子节点放入一个数组中,虽然编码时有点笨拙,但这意味着无论元素数量多少,结构至少总是一致的。

Soap扩展有一个功能选项

[child] => array(
   [name] => "John"
)
<s:complexType name="parent">
<s:sequence>
<s:element minOccurs="0" maxOccurs="unbounded" name="child" nillable="true" type="tns:child"/>
</s:sequence>
</s:complexType>
<s:complexType name="child">
<s:complexContent mixed="false">
<s:sequence>
<s:element minOccurs="1" maxOccurs="1" name="name" type="s:string"/>
</s:sequence>
</s:extension>
</s:complexContent>
</s:complexType>