PHP:如何在数组中存储XML数据?

时间:2010-04-06 08:40:02

标签: php xml simplexml

以下是我正在使用的XML - 还有更多项目 - 这是第一组。如何将这些元素放入数组中?我一直在尝试PHP的SimpleXML等,但我不能这样做。

<response xmlns:lf="http://api.lemonfree.com/ns/1.0">
  <lf:request_type>listing</lf:request_type> 
  <lf:response_code>0</lf:response_code> 
  <lf:result type="listing" count="10">
    <lf:item id="56832429">
      <lf:attr name="title">Used 2005 Ford Mustang V6 Deluxe</lf:attr> 
      <lf:attr name="year">2005</lf:attr> 
      <lf:attr name="make">FORD</lf:attr> 
      <lf:attr name="model">MUSTANG</lf:attr> 
      <lf:attr name="vin">1ZVFT80N555169501</lf:attr> 
      <lf:attr name="price">12987</lf:attr> 
      <lf:attr name="mileage">42242</lf:attr> 
      <lf:attr name="auction">no</lf:attr> 
      <lf:attr name="city">Grand Rapids</lf:attr> 
      <lf:attr name="state">Michigan</lf:attr> 
      <lf:attr name="image">http://www.lemonfree.com/images/stock_images/thumbnails/2005_38_557_80.jpg</lf:attr> 
      <lf:attr name="link">http://www.lemonfree.com/56832429.html</lf:attr> 
    </lf:item>
    <!-- more items -->
  </lf:result>
</response>

谢谢你们

编辑:我希望第一项数据易于访问变量,我一直在努力让SimpleXML工作,因为我是PHP的新手,所以我觉得操作数组更容易。

4 个答案:

答案 0 :(得分:1)

为什么要将它们放在数组中?它们已经结构化,直接用作XML。

SimpleXMLDOMDocument,现在它取决于您想要对数据做什么(您没有提到),哪一个更适合您。扩展您的问题以获取代码示例。


编辑:以下是如何使用SimpleXML处理文档的示例:

$url      = "http://api.lemonfree.com/listings?key=xxxx&make=ford&model=mustang";
$ns_lf    = "http://api.lemonfree.com/ns/1.0";
$response = simplexml_load_file($url);

// children() fetches all nodes of a given namespace
$result = $response->children($ns_lf)->result;

// dump the entire <lf:result> to see what it looks like
print_r($result);

// once the namespace was handled, you can go on normally (-> syntax)
foreach ($result->item as $item) {
  $title = $item->xpath("lf:attr[@name='title']");
  $state = $item->xpath("lf:attr[@name='state']");

  // xpath() always returns an array of matches, hence the [0]
  echo( $title[0].", ".$state[0] );
}

答案 1 :(得分:0)

也许您应该查看SimplePie,它将XML提要解析为数组或对象(嗯,其中一个:D)。我认为它也适用于名称空间和属性。

一些好处包括它的GPL许可证(它是免费的)和它的支持社区。

答案 2 :(得分:0)

SimpleXML是读/写XML文件的最佳方式。通常它就像使用数组一样简单,除非在你的情况下,因为涉及XML命名空间并且它使事情变得复杂。此外,用于存储属性的格式很糟糕,所以不是易于使用而且显而易见它有点复杂,所以这就是你正在寻找的东西,这样你就可以继续为你做一些更有趣的事情:

$response = simplexml_load_file($url);

$items = array();
foreach ($response->xpath('//lf:item') as $item)
{
    $id = (string) $item['id'];
    foreach ($item->xpath('lf:attr') as $attr)
    {
        $name = (string) $attr['name'];
        $items[$id][$name] = (string) $attr;
    }
}

您将在$items数组中拥有所需的一切,使用print_r()查看内部的内容。 $url应该是该lemonfree API的URL。该代码假定一个属性不能有多个值(例如多个图像)。

祝你好运。

答案 3 :(得分:0)

这是我将从客户端电子邮件地址簿系统返回的XML解析为数组的方式,以便我可以在页面上使用它。我认为使用XML解析器是PHP的一部分。

这是文档http://www.php.net/manual/en/ref.xml.php

$user_info = YOUR_XML

SETS $xml_array AS ARRAY
$xml_array = array();

// SETS UP XML PARSER AND PARSES $user_info INTO AN ARRAY
$xml_parser = xml_parser_create();

xml_parse_into_struct($xml_parser, $user_info, $values, $index);

xml_parser_free($xml_parser);

foreach($values as $key => $value)
{
    // $value['level'] relates to the nesting level of a tag, x will need to be a number
    if($value['level']==x)
    {
        $tag_name = $value['tag'];
        // INSERTS DETAILS INTO ARRAY $contact_array SETTING KEY = $tag_name VALUE = value for that tag
        $xml_array[strtolower($tag_name)] = $value['value'];
    }
}

如果你var_dump($ values)你应该看到你的信息所处的数据级别,我认为上面的XML将是4,所以你可以通过改变过滤掉你不想要的任何东西$ value ['level'] == x的值达到要求的水平,即。 $值[ '电平'] == 4。

这应该将$ xml_array作为数组返回$ xml_array ['title'] ='二手2005 Ford Mustang V6 Deluxe'等。

希望有所帮助