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)。
所以直到这一行,这应该显示了整个画面,除非我最后仓促行事。如果对您有帮助,请留下一些反馈,以及您认为缺少的地方。
我正在尝试弄清楚如何在下面的代码中获取和打印特定的 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 printIDValue
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)。
所以直到这一行,这应该显示了整个画面,除非我最后仓促行事。如果对您有帮助,请留下一些反馈,以及您认为缺少的地方。