处理此XML Feed的最佳方法是什么?

时间:2010-12-02 03:01:33

标签: php xml simplexml

我有一个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和订单行时都有一段代码是非常混乱的。有没有更好的方法?

我想到了编辑我的转换例程来处理这个问题的想法。如果你认为这是要走的路,那么请告诉我,但我当然认为这个问题肯定会出现很多问题,有人必须有一个聪明而简洁的解决方案吗?

由于

1 个答案:

答案 0 :(得分:1)

根据documentation for simplexml你应该总是能够迭代和下标属性,即使只有其中一个属性,这可能是实现你想要的“最佳”方式。例如:

for($xml->thingThereMayBeOneOrMoreOf as $item) {
  //handle $item
}

或者,如果您只需要处理第一项

$item=$xml->thingThereMayBeOneOrMoreOf[0];
//handle $item

另外,根据文档,这些属性实际上不是数组,而是可访问(可订阅)和可迭代属性,只是var_dump等会将它们转换为/将它们视为数组以进行转储。

我实际上没有测试过这个,ymmv。