2013-03-04 52 views
2

感謝您提前給予的幫助。我有搜索這個論壇,並通過www尋找這個答案,但無法找到一個直接的。使用PHP,simplexml_load_file和Xpath返回XML文件的唯一值

我只是試圖從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

這是唯一的數據,你想從這個PHP腳本運行該XML文檔? – VolkerK 2013-03-04 10:17:52

回答

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 < 2.0時,有一個叫Muenchian grouping方法,可幫助在這裏。

我還沒有測試這兩種方法對大數據集。他們可能是相當時間/內存消耗....

+0

嗨有Volkerk。謝謝,那非常出色。它在較大的文件上很慢,但它的確有竅門。謝謝。 – RonaldZN 2013-03-04 10:45:15