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