2010-09-08 13 views
2

How to convert XML to java.util.Map and vice versa有些相關,只是更通用。將XML結構解析爲簡單的通用映射和列表集合

我有一個XML文檔,我想將它轉換爲非常通用的一組鍵/值對(在Java中是這樣)。其基本思想是我們可以解析幾乎每一個XML文檔,並將其直接傳遞給一個JSP文件,該文件可以讀取值並顯示它們。

說一個具有XML結構如下:

<root> 
    <items> 
    <item id="10">Some item here</item> 
    </items> 
    <things> 
    <thing awesome="true"> 
    <orly-owl hoot="woot" /> 
    </thing> 
    </things> 
</root> 

的輸出將是一組都包含值,列表和其他maps地圖對象。以下是如何,理想情況下,它會被一個(僞)JSP文件中讀取:

<c:forEach var="item" items="${root.items}"> 
    ${item.id} 
    ${item.text} 
</c:forEach> 
<c:forEach var="things" items="${root.things}"> 
    Is it awesome? ${thing.awesome} 
    orly? ${thing.orly-owl.hoot} 
</c:forEach> 

基本上,這將會是各種各樣的XML解析器,有一個簡單的規則。

對於每個XML實體:

它是否有子節點?

添加條目與節點名稱映射爲鍵和列表(圖中)的值 是否有屬性或價值? 添加條目以屬性名稱作爲關鍵字和屬性值作爲值

...或某種程度上。我現在還沒有正確掌握數據結構。

所以我的問題是:有沒有一個現成的解析器可以做到這一點或類似的東西?

我今天發現和嘗試過的都映射到一個固定的對象層次結構,即您必須創建一個帶有自己屬性的Item對象列表的根對象。這並不壞,因爲它可以基於DTD對象自動生成,但是這是我目前的任務,可以試用這兩個選項。嘗試第一種方法,一旦映射完成xml文件對我有意義,錯誤消息開始告訴我我做錯了什麼,但一直沒能弄清楚如何做第二個(讀:寫遞歸遞歸xml解析器(dom或sax)遞歸遞歸) 。

一致性可能在這個問題上不存在的,它是五「點鐘。


編輯,通過一些更思前想後,它會工作(即發送對象JSP可以包含值,地圖和列表),但它會是非常棘手的問題,而帕例如,在下一個示例中進行分析:

<root thing="thine mother"> 
    <thing mabob="yus" /> 
    <thing mabob="nay" /> 
    <items> 
    <item id=1" /> 
    </items> 
</root> 

在此特定實例中,根目錄下有兩個相同名稱的東西元素。相同名稱的元素應該放入列表中。然而,在同一層次上有一個items元素,這是一個單獨的元素,應該作爲一個地圖項目進入。除此之外,在根元素中還有第三個名爲'element'的元素,整個事物都是錯誤的。如果不事先分析結構(並且設置一個像「在這個特定元素下有相同名稱和唯一命名元素」的標誌),你就不能假定這一點。我想要做的最後一件事是強制XML根據特定的結構。

我的同事實際上建議通過XSL運行XML,以便它'更扁平'(更像數據庫行),或者讓xml輸出的最大深度爲1。不是一種選擇,真的。

反正。感謝所有的建議,似乎這不是一個非常合理的解決方案 - 至少不會破壞XML和Common Sense的基本規則和慣例。

接下來的想法 - 讓JSP直接使用XML JSTL庫呈現文檔。

回答

2

看起來好像JSTL XML bindings將做你想要的。

而你不太可能使用列表和映射找到完全符合要求的任何事情的原因是因爲XML並沒有整齊地轉換成列表和地圖(主要原因是「你如何以不同的內容對待屬性?「)。

+0

「」你如何對待屬性與內容不同?「我想我會對待他們一樣。當然,這隻與我的特定情況有關,其中內容通常只是純文本。 – fwielstra 2010-09-09 06:56:44

3

JDOM肯定可以爲您提供從元素構建的列表。圖書館已經有相當長的一段時間了,使用起來非常簡單。 http://jdom.org/

1

apache-commons Digester能做到這一點,它是圍繞一個SAX解析器,可以讓你創建解組數據規則轉換爲對象的包裝。

OTOH如果你想知道如何做遞歸解析,你可以檢查出this article一個有趣的方法(使用遞歸轉換網絡)。這個想法是你創建一個顯示xml元素之間關係的對象網絡,並且當你使用堆棧解析時,你可以跟蹤你在這個網絡中的位置。