我正在使用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。我们不能在此查询,因此它只会采用相关的产品标签,因此可以减少加载时间。
有人可以帮忙吗?
答案 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()
将此列表中的第一个节点强制转换为字符串并返回它。如果列表为空,则结果将为空字符串。