PHP XML Feed - 如何在父项中打印特定子项的值。父节点与其他节点同名

PHP XML Feed - How to print value of specific child within parent. Parent has same name as other nodes

我正在尝试弄清楚如何在下面的代码中获取和打印特定的 IDValue,但是 ProductIdentifier 节点的数量和顺序因 Product 而异,所以我不能总是通过使用获得正确的值:

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

有没有办法做类似的事情:"If ProductIDType is 03, then print IDValue of that child node"?

<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);
      }
  }
?>

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

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

然而,使用 Xpath 也引入了一种新语言。所以有 xpath 部分,还有 PHP 部分。让我们首先只使用 Xpath(就像使用伪代码一样)。你想要:

Is there a way to do something like: "If ProductIDType is 03, then print IDValue of that child node"?

对于每个询问可能性的编程问题,都有答案 "most certainly yes" ;) - 所以这里是:

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

这是纯 Xpath,内容如下:给我一个名为 IDValue 的元素,它是整个系统中任何元素的子节点(* 是任何名称的通配符)文档(// 是根或更深),它有另一个名为 ProductIDType 的子节点,其字符串值为“03”(所谓的谓词)。

在您的情况下,您已经知道父元素的名称,因此您可以直接使用元素名称 (ProductIdentifier) 而不是 *。您还可以说出父元素名称是什么 (Product),这样您也可以使用它(这使事情更加具体,因此您表明您已经完全理解您正在寻找的内容) :

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

一些或多或少简单的伪代码本身并不运行。但值得理解,因为它是一个有效的 Xpath 表达式。

现在回到 PHP 和简单 XML。由于 SimpleXML 只能 query Xpath 表达式,它总是 returns 一个数组(而不是单个值)。但这没问题。如果您要查找单个值,则它是数组的第一个成员(值)。它由 [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)。

所以直到这一行,这应该显示了整个画面,除非我最后仓促行事。如果对您有帮助,请留下一些反馈,以及您认为缺少的地方。