【发布时间】:2013-06-24 10:21:01
【问题描述】:
我有一个包含订单的 XML 文件。
<?xml version="1.0" encoding="UTF-8"?>
<orders>
<order order-no="1234567">
<order-date>2012-09-15T12:28:45.000Z</order-date>
<invoice-no>123</invoice-no>
<customer>
<customer-no>1234</customer-no>
<customer-name>test</customer-name>
</customer>
<payments>
<payment>
<custom-method>
<method-name>example</method-name>
</custom-method>
<amount>12334</amount>
</payment>
</payments>
</order>
<order>
.......
</order>
</orders>
一个文件中有许多 <order> 节点。一切都是正确的,但突然间我收到了没有任何付款信息的订单
<orders>
<order order-no="1234567">
<order-date>2012-09-15T12:28:45.000Z</order-date>
<invoice-no>123</invoice-no>
<customer>
<customer-no>1234</customer-no>
<customer-name>test</customer-name>
<billing-address/>
</customer>
<payments/>
</order>
注意空的<payments/> 节点。
我的 PHP 脚本如下所示:
$file = file_get_contents('orders.xml');
$orders = new SimpleXMLElement($file);
foreach ($orders as $order) {
$var = $order->payments->payment->{'custom-method'}->{'method-name'};
}
对于第一个 XML 示例,一切都很好,但是当我偶然发现来自第二个 XML 示例的订单时,我的脚本抛出异常 Trying to get property of non-object 并且显然停止解析文件的其余部分。
我希望我的脚本不停止并继续解析文件的其余部分。我不想让你“闭嘴”@ 运营商,但我看不到任何其他方式。
【问题讨论】:
-
在访问
payment的成员之前,你为什么不测试payments是否是一个对象? -
我将该文件中的数据保存在数据库中,我检查了大约 40 个节点。您是否建议使用
property_exists添加一些功能? -
我正在回答这个具体案例。如果你有很多代码处理这个并且多个节点可能会丢失,你可以查看php.net/manual/en/class.simplexmliterator.php。如果您的 XML 可能“不完整”,我不确定为什么在访问每个级别之前不检查它。你有没有尝试捕捉这个特殊的异常?