为了账号安全,请及时绑定邮箱和手机立即绑定

使用 xpath 获取元素的最小/最大值

使用 xpath 获取元素的最小/最大值

PHP
慕无忌1623718 2022-01-14 16:13:01
我有一个像这样的 xml 表:<f:device-list>    <f:device name="Voltage Converter" quantity="2" serial_number="20011">        <f:weight units="pounds">3.00</f:weight>    </f:device>    <f:device name="24-port switch" quantity="2" serial_number="24PORTSW-004">        <f:weight units="pounds">3.34</f:weight>    </f:device></f:device-list>我正在使用 simplexml 和 xpath 获取设备的重量,如下所示:foreach($xml->xpath('//f:weight[@units="pounds"]') as $weightLB) {        echo $weightLB;        echo "</br>";}我试图弄清楚如何获得权重元素的最小值和最大值。我查看了许多有关 xpath 的解决方案,但大多数都涵盖了属性值,并且不适用于像这样格式化的工作表。任何帮助,将不胜感激!
查看完整描述

2 回答

?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

您可以将所有值映射到一个数组,然后使用max和min函数:


<?php


$xml = <<<XML

<?xml version='1.0'?>

    <device-list>

    <device name="Voltage Converter" quantity="2" serial_number="20011">

        <weight units="pounds">3.00</weight>

    </device>

    <device name="24-port switch" quantity="2" serial_number="24PORTSW-004">

        <weight units="pounds">3.34</weight>

    </device>

</device-list>

XML;


$simpleXml = simplexml_load_string($xml);


$weights = array_map(function($elem) {

    return $elem->__toString();

}, $simpleXml->xpath('//weight[@units="pounds"]'));


echo "Min: " .min($weights) . "<br/>";

echo "Max: " .max($weights);

输出:


最低:3.00


最大值:3.34


查看完整回答
反对 回复 2022-01-14
?
慕神8447489

TA贡献1780条经验 获得超1个赞

我正在添加这个纯 XPath 1.0 答案,因为在这种情况下,评论中链接的答案是错误的。最大值的一般成语:


($node-set[not(. < $node-set)])[1]

含义:


从节点集中选择第一个(按文档顺序),其数值不小于节点集中的任何其他节点。


对于您的输入(现在格式正确):


<f:device-list xmlns:f="dummy">  

  <f:device name="Voltage Converter" quantity="2" serial_number="20011"> 

    <f:weight units="pounds">3.00</f:weight> 

  </f:device>  

  <f:device name="24-port switch" quantity="2" serial_number="24PORTSW-004"> 

    <f:weight units="pounds">3.34</f:weight> 

  </f:device> 

</f:device-list>

这个 XPath 1.0 表达式(f前缀绑定到dummy命名空间 URI):


(//f:weight[@units='pounds'][not(. < //f:weight[@units='pounds'])])[1]

它选择:


<f:weight xmlns:f="dummy" units="pounds">3.34</f:weight>

签入http://www.xpathtester.com/xpath/1969ef047d90f2efbb0dcc1d1e131428


请注意:位置谓词(如[1]缩写形式)对位置步轴起作用,这意味着如果集合中的所有节点都是第一个子节点,那么您将需要括号来获得文档顺序中的第一个。


查看完整回答
反对 回复 2022-01-14
  • 2 回答
  • 0 关注
  • 335 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信