PHP XML提要-如何打印父级中特定子级的值。父节点与其他节点具有相同的名称

PHP XML提要-如何打印父级中特定子级的值。父节点与其他节点具有相同的名称,php,xml,feed,onix,Php,Xml,Feed,Onix,我正试图找出如何在下面的代码中获取并打印特定的IDValue,但是ProductIdentifier节点的数量和顺序因产品的不同而不同,因此我无法始终使用以下方法获得正确的值: <?php print $productXML[0]->ProductIdentifier[2]->IDValue; ?> 更新: 正如下面非常有用的注释所建议的,我尝试使用xpath,但在尝试通过php打印时,它只返回“Array”。我尝试了几种方法来修复它,从其他问题中记下了一些关于W3C文

我正试图找出如何在下面的代码中获取并打印特定的
IDValue
,但是
ProductIdentifier
节点的数量和顺序因
产品的不同而不同,因此我无法始终使用以下方法获得正确的值:

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

正如下面非常有用的注释所建议的,我尝试使用xpath,但在尝试通过php打印时,它只返回“Array”。我尝试了几种方法来修复它,从其他问题中记下了一些关于W3C文档和其他地方的问题,但没有成功

以下是我最终做的事情:

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

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

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

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

是否有这样的方法:“如果
ProductIDType
为03,则打印该子节点的
IDValue

对于每一个询问可能性的编程问题,答案都是“肯定的”;)这就是:

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

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

对于一些本身不运行的或多或少简单的伪代码来说,有很多词是值得理解的,因为它是一个有效的Xpath表达式

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

对于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
//ProductIdentifier[ProductIDType=03]/IDValue
您可以通过xpath轻松完成此操作,正如前面所述。我假设您使用的是Simplexml库,并根据显示如何运行xpath查询的参考问题结束了您的问题。如果您在这方面仍然遇到问题,请编辑您的问题以显示您到目前为止所获得的信息,并在此处ping。感谢您的支持它为我指明了正确的方向,不幸的是,我无法使用xpath使其正常工作。无论我尝试了什么,它每次都会返回“Array”(在末尾添加[0],等等),我仍然无法获得一个值。我将用我所采取的步骤和最终使用的方法更新我的问题。@nowvisiting:重新打开。SimpleXML的xpath方法将始终返回一个数组。我来看看。
//Product/ProductIdentifier[ProductIDType = "03"]/IDValue
<?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;
$xml = simplexml_load_string($buffer);

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

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