能够定义expect多个值的PHP XML解析器
我们必须编写读取器来定期输入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> <
<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>