Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 简单xml获取属性的最大值_Php_Xpath_Simplexml - Fatal编程技术网

Php 简单xml获取属性的最大值

Php 简单xml获取属性的最大值,php,xpath,simplexml,Php,Xpath,Simplexml,我正在尝试获取以下xml片段中每个项的选项节点的最大值和最小值: <body> <page number="1"> <itemset name="a"> <item id="1"> <option value="0">no</option> <option value="1">rarely</opti

我正在尝试获取以下xml片段中每个项的选项节点的最大值和最小值:

<body>
    <page number="1">
        <itemset name="a">
            <item id="1">
               <option value="0">no</option>
               <option value="1">rarely</option>
               <option value="3">sometimes</option>
               <option value="5">often</option>
               <scale id="ho" />
            </item>
            <item id="2">
                <option value="0">no</option>
                <option value="1">rarely</option>
                <option value="3">sometimes</option>
                <option value="5">often</option>
                <scale id="hi" />
            </item>
        </itemset>
    </page>
</body>
使用$values=$item->xpath'option[@value]';相反,我得到

foreach ($item->xpath("//item[@id='".$item['id']."']/option/@value") as $value) {
    $v[]=(int)$value->value;
}
echo max($v);
echo min($v);
我正在寻找一个更直接的解决方案-或者如何从那里得到最小值和最大值

我想得到像$values['max']=5和$values['min']=0这样的东西

提前谢谢大家,

米奇

PS:由于我无法使用simple_xml实现此功能,也不想切换到DOM,因此我决定使用一些基本的PHP快速完成此操作:

$doc = new DOMDocument();
@$doc->loadHTML($htmlcontent);

$selector = new DOMXPath($doc);

// get max value of item with id 1
$result = $selector->query('//item[@id=1]/option[not(preceding-sibling::option/@value >= @value) and not(following-sibling::option/@value > @value)]/@value');

if(!$result || $result->length < 1) {
    die('error');
}
foreach($result as $item) {
    echo 'max: ', $result->item(0)->value, PHP_EOL;
}


// get min value of item with id 1
$result = $selector->query('//item[@id=1]/option[not(preceding-sibling::option/@value <= @value) and not(following-sibling::option/@value < @value)]/@value');

if(!$result || $result->length < 1) {
    die('error');
}
foreach($result as $item) {
    echo 'min: ' . $result->item(0)->value, PHP_EOL;
}
借助于此,我得到了以下示例:


在示例XML上运行时,预期的输出是什么?顺便说一下,您的XML已损坏。所需的输出请参阅文章中的编辑。xml是一个片段,原始文件没有问题。@michi您可以在这里找到答案:该链接中的答案很好,您必须使用XPath 1.0解决方案,因为SimpleXML不支持XPath 2.0。@hek2mgl:解决了它,问题是关于ant脚本的。如果在XML文件中使用,我添加了一些提示来添加这些实体,但答案中保留了这些内容,因为这些内容都是关于XPath的,在XPath中,这些实体显然是错误的,显然会让人感到困惑。我想我们应该停止在这里的离题讨论,给你发了一封电子邮件。哇!我很快就会试试,让你知道,谢谢!想要继续使用simple_xml而不是DOM,请使用快速而肮脏的PHP Workaround编辑我的原始帖子。
    Array
(
    [0] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [value] => 0
            )

    )

    [1] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [value] => 1
            )

    )

    [2] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [value] => 3
            )

    )

    [3] => SimpleXMLElement Object
    (
        [@attributes] => Array
            (
                [value] => 5
            )

    )

)
foreach ($item->xpath("//item[@id='".$item['id']."']/option/@value") as $value) {
    $v[]=(int)$value->value;
}
echo max($v);
echo min($v);
$doc = new DOMDocument();
@$doc->loadHTML($htmlcontent);

$selector = new DOMXPath($doc);

// get max value of item with id 1
$result = $selector->query('//item[@id=1]/option[not(preceding-sibling::option/@value >= @value) and not(following-sibling::option/@value > @value)]/@value');

if(!$result || $result->length < 1) {
    die('error');
}
foreach($result as $item) {
    echo 'max: ', $result->item(0)->value, PHP_EOL;
}


// get min value of item with id 1
$result = $selector->query('//item[@id=1]/option[not(preceding-sibling::option/@value <= @value) and not(following-sibling::option/@value < @value)]/@value');

if(!$result || $result->length < 1) {
    die('error');
}
foreach($result as $item) {
    echo 'min: ' . $result->item(0)->value, PHP_EOL;
}