提前感谢您的协助。我已经通过这个论坛搜索并通过www寻找答案,但找不到直接的答案。
我只是想从XML文件返回结果,该文件只提取属性的唯一值。
XML示例文件:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<computers>
<restults>
<computer id="1" group_id="a" model_group="acer" name="Acer 1 GB" />
<computer id="2" group_id="a" model_group="acer" name="Acer 2 GB" />
<computer id="3" group_id="b" model_group="acer" name="Acer 3 GB" />
<computer id="4" group_id="c" model_group="acer" name="Acer 4 GB"/>
<computer id="5" group_id="c" model_group="acer" name="Acer 6 GB" />
<computer id="6" group_id="d" model_group="acer" name="Acer 8 GB" />
<computer id="7" group_id="d" model_group="acer" name="Acer 16 GB" />
<computer id="8" group_id="d" model_group="acer" name="Acer 32 GB" />
<computer id="9" group_id="e" model_group="acer" name="Acer 48 GB" />
</restults>
</computers>
我想要的是php脚本在XML文件中运行,并且只向我显示唯一的"group_id" values. ie: a,b,c,d,e
没有更多。
我已经查看了本网站和其他网站提供的各种解决方案,但他们还没有工作。
我确实读过有关Xpath函数和distinct-values函数但我找不到一种方法来确定我正在运行的Xpath版本?我知道这个函数仅在Xpath 2.0中可用
答案 0 :(得分:1)
仅使用XPath 1.0,我所知道的唯一解决方案是检查所有先前节点的相同值,如果找到则排除此节点。
<?php
$e = new SimpleXMLElement(data());
foreach( $e->xpath('/computers/restults/computer[not(@group_id=preceding-sibling::computer/@group_id)]/@group_id') as $n ) {
echo $n, "\n";
}
function data() {
return <<< eox
<computers>
<restults>
<computer id="1" group_id="a" model_group="acer" name="Acer 1 GB" />
<computer id="2" group_id="a" model_group="acer" name="Acer 2 GB" />
<computer id="3" group_id="b" model_group="acer" name="Acer 3 GB" />
<computer id="4" group_id="c" model_group="acer" name="Acer 4 GB"/>
<computer id="5" group_id="c" model_group="acer" name="Acer 6 GB" />
<computer id="6" group_id="d" model_group="acer" name="Acer 8 GB" />
<computer id="7" group_id="d" model_group="acer" name="Acer 16 GB" />
<computer id="8" group_id="d" model_group="acer" name="Acer 32 GB" />
<computer id="9" group_id="e" model_group="acer" name="Acer 48 GB" />
</restults>
</computers>
eox;
}
使用XSLT时&lt; 2.0有一个名为Muenchian grouping的方法,在这里可能会有所帮助。
我没有针对大型数据集测试这两种方法。它们可能相当耗费时间/内存....