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