我正在尝试弄清楚如何在下面的代码中抓取并打印特定的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);
}
}
?>
不是最优雅的解决方案,但它现在输出正确的值。
答案 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)。
所以直到这一行,这应该显示整个画面,除非我最后冲了太多。如果它对您有帮助,请留下一些反馈,以及您的观点中缺少的内容。