2011-12-10 44 views
1

如何使用番石榴Multimap之表示下面的XML:表示XML名稱和值

<node key="abc123">some value</node> 
<node key="asdf22"> 
    <node key="as234">some value343</node> 
    <node key="sggg234">some value234234</node> 
</node> 

在我的XML文件中,90%的時間給定節點元素不會有內部節點(如果我可以爲此優化?)。

我想要的是一個KeyValuePair集合,其中的值是另一個keyValuePairs集合。

在C#中我可以這樣做:

public List<string,List<KeyValuePair<string,string>>> nodes; 

有人告訴我,看番石榴的多重映射,但不知道如何正確使用它,有人可以幫我嗎?

順便說一句,因爲90%的案例我不需要價值是另一個列表,我可以以某種方式優化這種情況?

+0

您試圖表示兩種不同的數據類型,一個字符串或一組節點。普通的XML解析器會使用內部文本的文本節點;您可以創建與您展示的C#示例相同的地圖,但是如何存儲僅包含文本的第一個節點?除非你沒有特殊的值('null'?),因爲沒有節點時,所顯示的結構對我來說不會立即有意義。 –

回答

2

不確定MultiMap是否適合您在此處描述的內容。一個multimap就是你有多個相同鍵值的地方。這不是你的XML描述的。您的XML描述了一個層次結構,其中每個值都有一個路徑,可能有多個鍵連接在一起描述它在層次結構中的位置。

從建模的角度來看,我會考慮使用2種類型的XML節點。 1保存值,另一個保存節點(認爲文件vs目錄)。您需要切換XML,以便在兩種不同類型之間進行清晰的描述。這樣解析會更容易。

所以,在粗糙的僞代碼..

class Container { 
    private Map<String,String> keyValuePairs; 
    private Map<String,Container> children; 
} 

這給了你無限的深度。每個容器可以容納keyValue對以及其他容器。頂級節點應該是根容器。遞歸應該是微不足道的。按鍵/分隔符遍歷也應該很容易。

可能比您需要更靈活。必要時修剪。

你也可以合併值/容器的概念,但是你的建模會變得有點醜。這是一個折衷。

+0

我無法控制xml。 – Blankman

+0

這是不幸的,但不是一個表演塞。它只是使解析觸摸更復雜,但仍然可行。 – rfeak