PHP XML Feed - 如何在父级内打印特定子级的值。 Parent与其他节点具有相同的名称

时间:2015-08-20 15:56:52

标签: php xml feed onix

我正在尝试弄清楚如何在下面的代码中抓取并打印特定的IDValue,但ProductIdentifier个节点的数量和顺序因Product而异,所以我可以使用以下方法始终获得正确的值:

<?php print $productXML[0]->ProductIdentifier[2]->IDValue; ?>

有没有办法可以执行以下操作:“如果ProductIDType为03,则打印该子节点的IDValue”?

<Product>
  <RecordReference>PublishingGroup</RecordReference>
  <NotificationType>03</NotificationType>
  <RecordSourceType>01</RecordSourceType>
  <RecordSourceName>Publishing Group</RecordSourceName>
  <ProductIdentifier>
    <ProductIDType>01</ProductIDType>
    <IDTypeName>ID</IDTypeName>
    <IDValue>28831</IDValue>
  </ProductIdentifier>
  <ProductIdentifier>
    <ProductIDType>02</ProductIDType>
    <IDValue>0163668869</IDValue>
  </ProductIdentifier>
  <ProductIdentifier>
    <ProductIDType>03</ProductIDType>
    <IDValue>9180763668860</IDValue>
  </ProductIdentifier>
  <ProductIdentifier>
    <ProductIDType>15</ProductIDType>
    <IDValue>9180763668860</IDValue>
  </ProductIdentifier>

更新

我尝试使用xpath,正如下面非常有用的评论所示,但它在尝试通过php打印时只返回“Array”。我尝试了几种方法来修复它,在SO和W3C文档和其他地方注意到其他问题,但没有运气。

这是我最终做的事情:

<?php
  foreach($productXML[0]->ProductIdentifier as $value) {
    if($value->ProductIDType=='03')
      {
      print ($value->IDValue);
      }
  }
?>

不是最优雅的解决方案,但它现在输出正确的值。

1 个答案:

答案 0 :(得分:1)

首先,有从文档中提取节点(-value)的操作。由于整个文档是一种节点树,运行xpath查询有助于在这里完成任务,尤其是当您有条件获取特定节点(-value)时。

但是,使用Xpath还会引入一种新语言。所以有xpath-part,还有PHP-part。让我们先做Xpath(就像伪代码一样)。你想要:

  

有没有办法做类似的事情:&#34;如果ProductIDType是03,那么打印那个子节点的IDValue&#34;?

正如每个寻求可能性的编程问题一样,答案是肯定的,而且肯定是的。#34; ;) - 所以这里是:

//*[ProductIDType = "03"]/IDValue

这是纯Xpath,如下所示:给我一个名为IDValue的元素,它是整个文档中任何元素(*是任何名称的通配符)的子节点( //是root或更深的),它有另一个名为ProductIDType的子节点,其字符串值为&#34; 03&#34; (所谓的谓词)。

在您的情况下,您已经知道父元素的名称,因此您可以直接使用元素名称*而不是ProductIdentifier。而且你也可以说出父元素名称是什么(Product),所以你也可以使用它(这会使事情变得更具体,所以你表明你已经完全理解了你所做的事情。寻找):

//Product/ProductIdentifier[ProductIDType = "03"]/IDValue

对于一些或多或少的简单伪代码,许多单词都不会运行。但它值得理解,因为它是一个有效的Xpath表达式。

现在回到PHP和SimpleXML。由于SimpleXML只能查询 Xpath表达式,因此它总是返回一个数组(而不是单个值)。但这没问题。如果您要查找单个值,它就是数组的第一个成员(值)。 [0]在零索引数组上访问哪一个( SimpleXMLElement::xpath()返回,除非出现错误(或者根本没有元素)。)

如果是您的XML片段:

<?php

$buffer = <<<XML
<Product>
  <RecordReference>PublishingGroup</RecordReference>
  <NotificationType>03</NotificationType>
  <RecordSourceType>01</RecordSourceType>
  <RecordSourceName>Publishing Group</RecordSourceName>
  <ProductIdentifier>
    <ProductIDType>01</ProductIDType>
    <IDTypeName>ID</IDTypeName>
    <IDValue>28831</IDValue>
  </ProductIdentifier>
  <ProductIdentifier>
    <ProductIDType>02</ProductIDType>
    <IDValue>0163668869</IDValue>
  </ProductIdentifier>
  <ProductIdentifier>
    <ProductIDType>03</ProductIDType>
    <IDValue>9180763668860</IDValue>
  </ProductIdentifier>
  <ProductIdentifier>
    <ProductIDType>15</ProductIDType>
    <IDValue>9180763668860</IDValue>
  </ProductIdentifier>
</Product>
XML;

到目前为止讨论的xpath查询的结果:

$xml = simplexml_load_string($buffer);

$first = $xml->xpath('//Product/ProductIdentifier[ProductIDType = "03"]/IDValue')[0];

echo $first, "\n"; # prints: "9180763668860\n"

这也是示例(see it in full as online-demo)。

所以直到这一行,这应该显示整个画面,除非我最后冲了太多。如果它对您有帮助,请留下一些反馈,以及您的观点中缺少的内容。