PHP XML Parser能够定义期望多个值

时间:2014-06-02 03:35:33

标签: php xml xsd wsdl dtd

我们必须写读者定期输入xml数据,我们得到的常见错误是,如果你有一个可以有多个孩子的节点,并且在特定情况下只有一个孩子,那么结果数组或对象将返回单个子节点而不是子节点数组。

例如,解析:

<parent>
  <child name="Bill">
  </child>
  <child name="John">
  </child>
</parent>

将返回一个对象或数组,如:

[child] => array(
   [0] => array(
      [name] => "Bill"
   )
   [1] => array(
      [name] => "John"
   )
)

解析:

<parent>
  <child name="John">
  </child>
</parent>

将返回:

[child] => array(
   [name] => "John"
)

我知道,根据具体情况,我们可以手动检查这些内容,如:

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的列表,并且总是返回一个值数组而不是使用最佳猜测来折叠单个值,或者是否可以将解析器设置为始终将每个子节点都放入一个数组中,虽然编码时有点笨重,但意味着无论元素数量多少,结构至少始终保持一致。

1 个答案:

答案 0 :(得分:1)

Soap扩展程序具有SOAP_SINGLE_ELEMENT_ARRAYS功能选项。