【问题标题】:Filter php simple_xml load results with xpath使用 xpath 过滤 php simple_xml 加载结果
【发布时间】:2018-12-04 05:05:30
【问题描述】:

我需要一点帮助来弄清楚 PHP 中 XML 输出 simple_xml_load 中的 XPath 搜索。我有这个 XML:

<PRODUCTS>
  <PRODUCT>
    <CODE>5009444</CODE>
    <NAME>Prova</NAME>
    <IMG>prova.jpg</IMG>
  </PRODUCT>
  ....
  ....
</PRODUCTS>

我想过滤和遍历这些数据以查找并返回所有带有可变代码的事件。 我使用了这种语法,但没有用

$id = 1;
$struct = \App\Models\Structures::where('id', $id)->first();
$url = 'http://demo.villaggissimi.it/public/xml/CMP_' . $struct->operators->pk .'.xml';
$xc = simplexml_load_file($url) or die("Non sono stati trovati risultati");
$xml2 = $xc->xpath("/PRODUCTS/PRODUCT[CODE='$struct->code']");
return response()->json($xml2);

【问题讨论】:

  • 找出所有出现的究竟是什么?
  • 我需要迭代具有相同“CODE”值的槽结果。但我不想使用 foreach 和 if 语句,而是直接使用 xpath
  • CODE 是节点名称而不是属性,因此您的 XPath 是错误的,因为它将其作为属性处理。
  • @PatrickMevzek,如果它是一个属性 - 您将在 XPath 中使用 [@CODE=
  • 请比“没用”更具体。向我们展示minimal reproducible example - 一个我们可以实际测试的小文档,带有您想要的输出、相关代码(我们不需要知道$url$struct)以及您得到的输出。

标签: php xml laravel xpath simplexml


【解决方案1】:

Xpath 表达式的结果是一个节点列表,SimpleXMLElement:xpath() 只支持这种结果,它总是会返回一个 SimpleXMLElement 对象数组(对于一个有效的 Xpath 表达式)。

因此,如果没有找到任何元素,您仍然必须使用foreach()/if() 以避免出现错误消息。

但是,您可以将结果限制为只有一个节点的列表。

foreach ($xc->xpath("/PRODUCTS/PRODUCT[CODE='$struct->code'][1]") as $productNode) {
  return response()->json($productNode);
}
return FALSE;

$productNodes = $xc->xpath("/PRODUCTS/PRODUCT[CODE='$struct->code'][1]");
if (count($productNodes) > 0) {
  return response()->json($productNodes[0]);
}
return FALSE;

【讨论】:

    猜你喜欢
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 2016-07-27
    • 2016-11-08
    • 2017-08-26
    • 1970-01-01
    • 2013-02-02
    相关资源
    最近更新 更多