PHP - 从XML文件中的特定子元素获取数据

时间:2013-05-24 09:35:02

标签: php xml simplexml

我是一名PHP /开发新手,我无法找到解决此特定问题的教程。

我有一个来自API的XML文件,其中包含在线商店的产品信息。每个物理产品都有多个“样式”,需要在同一页面上列出。我想用他们的id号做到这一点。

以下是我的Feed的简化版本:

<products>
  <product id="001">
    <name>Shirt 1 - Women's</name>
    <price>12.00</price>
    <color>blue</color>
  </product>

  <product id="002">
    <name>Shirt 1 - Men's</name>
    <price>12.00</price>
    <color>red</color>
  </product>
   ...
  <product id="023">
    <name>Shirt 12 - Women's</name>
    <price>15.00</price>
    <color>purple</color>
  </product>

  <product id="024">
    <name>Shirt 12 - Men's</name>
    <price>15.00</price>
    <color>yellow</color>
  </product>

</products>

因此,在shirt12.php上,我需要从<product id="023"><product id="024">获取只是信息,因为这些信息包含我对“Shirt 12”样式的信息。

使用simplexml我可以使用以下代码获取一个<product>的数据:

foreach ($products->product as $product) {
if ($product['id'] == '024') { 
  //display data using some code
  }
}

我不知道我是怎么做两个以上的。如果可以用simplexml完成​​,那就太好了,因为我最熟悉它。但是如果我需要使用不同的XML解析方法,我也会对此持开放态度,但它需要与wordpress兼容。

3 个答案:

答案 0 :(得分:1)

XPath

可以让事情变得更轻松
$xml=simplexml_load_string(<<<XML
<products>
  <product id="001">
    <name>Shirt 1 - Women's</name>
    <price>12.00</price>
    <color>blue</color>
  </product>

  <product id="002">
    <name>Shirt 1 - Men's</name>
    <price>12.00</price>
    <color>red</color>
  </product>
  <product id="023">
    <name>Shirt 12 - Women's</name>
    <price>15.00</price>
    <color>purple</color>
  </product>

  <product id="024">
    <name>Shirt 12 - Men's</name>
    <price>15.00</price>
    <color>yellow</color>
  </product>

</products>
XML
);
foreach($xml->xpath('//product[starts-with(name/text(),"Shirt 12")]') as $product)
{
    echo $product->name;
    echo "\n";
    echo $product->price;
    echo "\n";
    echo $product->color;
    echo "\n\n";
}

Online Demo

<强>更新

如果你需要通过id获取,只需更改XPath:

foreach($xml->xpath('//product[@id="023" or @id="024"]') as $product)

Online Demo也演示了如何获取ID属性。

答案 1 :(得分:1)

有很多方法可以解决这个问题,其中一种方法是你可以使用in_array()函数来测试多个id值:

$ids = array('023', '024');

foreach ($product->product as $product) {
    if (in_array($product['id'], $ids)) { 
        //display data using some code
    }
}

请参阅相关问题:PHP If Statement with Multiple Conditions

我选择了那个,因为你也可以在其他情况下使用它,并且还表明你的问题与XML没有特别的关系,但更多的是PHP本身。

我希望它对你有所帮助。

答案 2 :(得分:0)

你的意思是这样吗?

foreach ($product->product as $product) {
if ($product['id'] == '023'||$product['id'] == '024') { 
  //display data using some code
  }
}

另外,不确定为什么每个id都有不同的php页面,如果它是一个产品页面,那么它应该是动态的

shirt.php?id=12