【问题标题】:How to get perticular node value? in xml using php如何获得特定的节点值?在 xml 中使用 php
【发布时间】:2014-03-25 12:53:34
【问题描述】:

我使用 xml 数据使用 url & 因为 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 循环并成功执行了条件,但是......东西在里面,它打印了它的父节点的所有节点的全部数据。

困惑? :)

好的,不用担心,只需执行这个 url:https://retailapi.apparel21.com/RetailAPI/products?countrycode=au;请点击继续按钮,然后等待一段时间。

有很多产品标签...现在我想要以下节点的数据:- ID 代码 姓名 说明

code=00122 是第一个产品的数据。

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

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

还有一件事:- 你可以看到我正在加载 url,所以它会首先读取整个 xml。难道我们不能自己查询,这样它就只需要相关的产品标签,这样就可以减少加载时间。

有人可以帮忙吗?

【问题讨论】:

  • 您能分享一段相关 XML 结构的摘录吗?
  • 嗨,杰克,你能告诉我摘录是什么意思吗?如果你想要 xml 的样子......那么就是这个:- retailapi.apparel21.com/RetailAPI/products?countrycode=au 我已经在问题中提到了 jack :)
  • 您需要查询的 XML 结构的一小部分但相关的部分。
  • 嗨,杰克,这是 xml 的一小部分:-
  • @Kaushal:edit 你的问题是包含一小段相关的 XML。你的链接不适合我。在提出任何其他问题之前,请阅读help center

标签: php xml


【解决方案1】:

你快到了。将 DOMXpath::query() 替换为 DOMXpath::evaluate()。它允许使用像字符串一样返回标量的 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-&gt;evaluate('Id', $node) 这样的调用将返回一个列表,其中包含所有Id 元素节点,它们是$node 的子节点。 Xpath 函数string() 将此列表中的第一个节点转换为字符串并返回它。如果列表为空,则结果将为空字符串。

【讨论】:

  • 嗨,ThW,非常感谢您的回答。它工作得很好:) 所以我 60% 的问题得到了解决:) 现在我唯一想问你的是......当我们调用 xml 时我们可以只加载那些特定的数据吗?我的意思是这个语句首先加载整个 xml 对吗?这需要时间 Thw :( 然后它给出答案。$doc->load("retailapi.apparel21.com/RetailAPI/products?countrycode=au"); 我们不能在调用时直接对 xml 进行查询,以便它只获取所需的数据,因此加载时间可以会减少吗?:)
  • 1c1 2582361 2c2 25823613c3 25923 我想要那些具有 ReferenceTypeId=258 和 ID 的产品的 ID 和代码=2361 我们可以这样做吗?
  • 仅当服务支持它并且服务支持它的方式。这是网址中的countrycode 参数,可能也支持其他参数。询问服务提供商。当然如果你获取所有数据,你可以在本地缓存它,并使用缓存中的本地xml文件。
  • 您好,谢谢。现在最后一件事是我已经给出了上面的 xml 并且我想要两个条件来收集数据。我已经应用了这个逻辑,但没有应用:- foreach ($xpath->evaluate("/Products/Product/References/Reference[ReferenceTypeId='258'] && /Products/Product/References/Reference[ReferenceTypeId='2361'] ") as $node) 基本上我想检查 ReferenceTypeId=258 & ID=2361 的两个条件,然后获取该产品的数据,否则跳过该产品。所以我坚持如何给出两个条件:)
  • Xpath 中没有&amp;&amp;,您可以使用| 提供多个表达式。 (很像 css 选择器中的逗号。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多