【问题标题】:PHP - Fetch data from specific child elements in XML filePHP - 从 XML 文件中的特定子元素中获取数据
【发布时间】:2013-05-24 09:35:01
【问题描述】:

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

我有一个来自 API 的 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>

所以在shirt12.php 上,我需要&lt;product id="023"&gt;&lt;product id="024"&gt; 获取信息,因为它们包含我的“衬衫12”样式的信息。

使用 simplexml,我可以使用以下代码获取一个 &lt;product&gt; 的数据:

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

我不知道如何为两个或两个以上做到这一点。如果可以使用 simplexml 完成,那就太好了,因为我最熟悉它。但是如果我需要使用不同的 XML 解析方法,我也愿意,但是它需要与 wordpress 兼容。

【问题讨论】:

  • 你能为023添加其他'if'吗?

标签: php xml simplexml


【解决方案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】:

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 属性。

【讨论】:

  • 你能告诉我如何只使用&lt;product id=#&gt; 中的 id 号来做到这一点吗?不幸的是,我的 XML 文件没有像我的示例那样对每个产品进行命名。此外,产品 ID 号将用作 &lt;div&gt;&lt;li&gt; 标记的相应 ID 号,用于显示每个单独的产品样式。
【解决方案3】:

你的意思是这样吗?

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

另外,不知道为什么每个 id 都有不同的 php 页面,如果是产品页面,它应该是动态的,所以

shirt.php?id=12 

【讨论】:

    猜你喜欢
    • 2014-10-26
    • 2018-11-30
    • 2019-12-28
    • 1970-01-01
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多