我有一个XML文档,它给我地址。这是一段摘录:
<ezi:orderaddresses>
<ezi:orderaddress>
<ezi:addresstype>billing</ezi:addresstype>
<ezi:name>Jason Fonseca</ezi:name>
<ezi:companyname>Cyber</ezi:companyname>
<ezi:address1>8 springstein</ezi:address1>
<ezi:division>NT</ezi:division>
<ezi:postalcode>34245</ezi:postalcode>
<ezi:countrycode>AU</ezi:countrycode>
<ezi:email>jason@bigcreative.com.au</ezi:email>
<ezi:phone>89549854</ezi:phone>
<ezi:mobilephone>984590598</ezi:mobilephone>
</ezi:orderaddress>
<ezi:orderaddress>
<ezi:addresstype>shipping</ezi:addresstype>
<ezi:name>Jason Fonseca</ezi:name>
<ezi:companyname>Cyber</ezi:companyname>
<ezi:address1>8 springstein</ezi:address1>
<ezi:division>NT</ezi:division>
<ezi:postalcode>34245</ezi:postalcode>
<ezi:countrycode>AU</ezi:countrycode>
<ezi:email>jason@bigcreative.com.au</ezi:email>
<ezi:phone>89549854</ezi:phone>
</ezi:orderaddress>
</ezi:orderaddresses>
除了两个“orderaddress”标签的上述格式外,还可以有一个,例如:
<ezi:orderaddresses>
<ezi:orderaddress>
<ezi:addresstype>billing</ezi:addresstype>
<ezi:name>Jason Fonseca</ezi:name>
<ezi:companyname>Cyber</ezi:companyname>
<ezi:address1>8 springstein</ezi:address1>
<ezi:division>NT</ezi:division>
<ezi:postalcode>34245</ezi:postalcode>
<ezi:countrycode>AU</ezi:countrycode>
<ezi:email>jason@bigcreative.com.au</ezi:email>
<ezi:phone>89549854</ezi:phone>
<ezi:mobilephone>984590598</ezi:mobilephone>
</ezi:orderaddress>
</ezi:orderaddresses>
我发现当使用简单的xml来解释它时,在第一个实例中,我得到以下内容:
[orderaddresses] => SimpleXMLElement Object
(
[orderaddress] => Array
(
[0] => SimpleXMLElement Object
(
[addresstype] => billing
[name] => Jason Fonseca
[companyname] => Cyber
[address1] => 8 springstein
[division] => NT
[postalcode] => 34245
[countrycode] => AU
[email] => jason@bigcreative.com.au
[phone] => 89549854
[mobilephone] => 984590598
)
[1] => SimpleXMLElement Object
(
[addresstype] => shipping
[name] => Jason Fonseca
[companyname] => Cyber
[address1] => 8 springstein
[division] => NT
[postalcode] => 34245
[countrycode] => AU
[email] => jason@bigcreative.com.au
[phone] => 89549854
)
)
)
在第二个例子中,我得到了这个:
[orderaddresses] => SimpleXMLElement Object
(
[orderaddress] => SimpleXMLElement Object
(
[addresstype] => billing
[name] => Jason Fonseca
[companyname] => Cyber
[address1] => 8 springstein
[division] => NT
[postalcode] => 34245
[countrycode] => AU
[email] => jason@bigcreative.com.au
[phone] => 89549854
[mobilephone] => 984590598
)
)
如果我尝试访问,Keen观察员会注意到 orderaddresses-&gt; orderaddress,根据是否有两个地址(或更多)或只有一个地址,这将具有不同的结构。 例2,它是数字索引数组,例2,它是一个关联对象。
为了标准化,我使用了一些看起来像这样的代码:
if(!isset($content['orderlines']['orderline'][0]))
{
$temp = $content['orderlines']['orderline'];
unset($content['orderlines']['orderline']);
$content['orderlines']['orderline'][0] =$temp;
}
(你可以忽略我在这里使用关联数组的事实,我有一个执行转换的例程,但我已经检查过,这个例程不会改变结果)。
我的问题是,我该如何正确地对这些数据进行整合?每次我尝试访问orderaddress和订单行时都有一段代码是非常混乱的。有没有更好的方法?
我想到了编辑我的转换例程来处理这个问题的想法。如果你认为这是要走的路,那么请告诉我,但我当然认为这个问题肯定会出现很多问题,有人必须有一个聪明而简洁的解决方案吗?
由于
答案 0 :(得分:1)
根据documentation for simplexml你应该总是能够迭代和下标属性,即使只有其中一个属性,这可能是实现你想要的“最佳”方式。例如:
for($xml->thingThereMayBeOneOrMoreOf as $item) {
//handle $item
}
或者,如果您只需要处理第一项
$item=$xml->thingThereMayBeOneOrMoreOf[0];
//handle $item
另外,根据文档,这些属性实际上不是数组,而是可访问(可订阅)和可迭代属性,只是var_dump等会将它们转换为/将它们视为数组以进行转储。
我实际上没有测试过这个,ymmv。