如何获得特定的节点值?在xml中使用php

时间:2014-02-24 02:38:11

标签: php xml

我正在使用url& amp;因为xml太长我只想检查条件以获取特定的节点值: -

这是我的代码: -

<?php
$doc = new DOMDocument('1.0', 'utf-8');
$doc->load("https://retailapi.apparel21.com/RetailAPI/products?countrycode=au");

$xpath = new DOMXpath($doc);
/*foreach ($xpath->query("/Products/Product[Code='00122']") as $node)
{
    echo $node->nodeValue;
    echo "Hi<br>";
}*/

echo $xpath->query("/Products/Product[Code='00122']")->item(0)->nodeValue;
?>

正如您所看到的,我已经使用了foreach循环和放大器成功执行了条件,但.....里面的东西,它打印出它父节点的所有节点的整个数据。

困惑? :)

好吧,不用担心,只需执行此网址:https://retailapi.apparel21.com/RetailAPI/products?countrycode=au;请点击Proceed anyway按钮然后等待一段时间。

有很多产品标签......现在我想要以下节点的数据: - ID 码 名称 描述

其代码= 00122,这是第一个产品的数据。

我应用foreach然后它打印了该产品的所有节点数据。我应用了简单的单个语句,但它也打印了所有节点的数据:(

还有一件事是不能通过simplexml_load_file函数来完成的吗?

还有一件事: - 你可以看到我正在加载url,所以问题是它将首先读取整个xml。我们不能在此查询,因此它只会采用相关的产品标签,因此可以减少加载时间。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

你快到了。用DOMXpath :: evaluate()替换DOMXpath :: query()。它允许使用返回像字符串一样的标量的Xpath表达式。现在,evaluate()(或query())的第二个参数是上下文,因此您可以从一个表达式迭代所有节点,并根据上下文节点使用xpath表达式获取详细信息:

$doc = new DOMDocument('1.0', 'utf-8');
$doc->load("https://retailapi.apparel21.com/RetailAPI/products?countrycode=au");
$xpath = new DOMXpath($doc);

$result = [];
foreach ($xpath->evaluate("/Products/Product[Code='00122']") as $node) {
  $result[] = [
    'id' => $xpath->evaluate('string(Id)', $node),
    'code' => $xpath->evaluate('string(Code)', $node),
    'name' => $xpath->evaluate('string(Name)', $node),
  ];   
}

var_dump($result);

$xpath->evaluate('Id', $node)之类的调用将返回一个列表,其中包含$ node的子节点的所有Id个元素节点。 Xpath函数string()将此列表中的第一个节点强制转换为字符串并返回它。如果列表为空,则结果将为空字符串。