2010-12-02 106 views
1

我有一个XML文件给我地址。下面是摘录:处理此XML Feed的最佳方式是什么?

<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>[email protected]</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>[email protected]</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>[email protected]</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] => [email protected] 
         [phone] => 89549854 
         [mobilephone] => 984590598 
        ) 

       [1] => SimpleXMLElement Object 
        (
         [addresstype] => shipping 
         [name] => Jason Fonseca 
         [companyname] => Cyber 
         [address1] => 8 springstein 
         [division] => NT 
         [postalcode] => 34245 
         [countrycode] => AU 
         [email] => [email protected] 
         [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] => [email protected] 
        [phone] => 89549854 
        [mobilephone] => 984590598 
       ) 

     ) 

Keen观察者会注意到,现在如果我尝试访问 orderaddresses-> orderaddress,这将根据是否有两个地址(或更多)或只有一个地址而具有不同的结构。 示例2它是一个数字索引数组,示例二它是一个关联对象。

为了规范这一点,我已经使用了一些代码,看起来像这样:

if(!isset($content['orderlines']['orderline'][0])) 
    { 
     $temp = $content['orderlines']['orderline']; 
     unset($content['orderlines']['orderline']); 
     $content['orderlines']['orderline'][0] =$temp; 
    } 

(你可以忽略我使用关联数组这里的事实,我有一个例程执行转换,但我已经检查,这个例程不会改变结果)。

我的问题是,我应该如何正确地插入这些数据?每次尝试访问orderaddress和命令行时都会有这样的代码片断,实在太乱了。没有更好的方法吗?

编辑我的转换例程来处理这个想法已经超越了我的想法。如果你认为这是一条路,那么让我知道,但我认为自己肯定会遇到这个问题,而且有人必须有一个明智而简单的解决方案呢?

感谢

回答

1

按照documentation for simplexml你应该总是能够遍历等属性即使只是其中之一,这可能是实现你想要什么的“最好”的方式。例如:

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

或者,如果你只需要处理的第一个项目

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

此外,根据文档,这些特性实际上不是数组,但访问的(标化)和迭代的特性,只是var_dump等会将它们转换为/将它们当作数组用于转储。

我还没有真正测试过这个,ymmv。

+0

酷感谢,我会试试看,但看起来像去 – Jason 2010-12-02 04:59:07

相关问题