2011-09-23 35 views
2

是否有任何java xml庫可以按照定義的順序創建帶有屬性的xml標記? 我必須創建每個標籤具有5到20個屬性的大型xml文件,並且我希望爲了更好的可讀性而訂購屬性。始終創建的屬性應該在開頭,後面跟着通用屬性,很少使用的屬性應該在末尾。保持屬性順序的Java XML庫?

+0

您目前如何生成XML? –

+1

爲什麼不先排序屬性列表然後添加它們。 我不知道你的模型是什麼樣子,但如果屬性名稱在列表中,它應該像調用Collections.sort(list)一樣簡單,然後你可以使用任何XML lib來添加屬性......或者我錯過了什麼? – peshkira

+0

@peshkira他不想對它們進行排序,他希望以某種預定的,可能未排序的順序在XML中查看它們。 –

回答

1

我不知道任何這樣的庫。

問題是XML信息模型明確指出標籤屬性的順序是不相關的。因此,任何保留排序努力的內存中的XML表示都會比所需的更多的內存和/或次優地實現屬性set/get方法。

我的建議是在您的XML內容的演示文稿中實現屬性的排序;例如在您的XML編輯器中。


我要指出,我的答案回答書面問題的 - 關於「保持屬性,以便」。這可能意味着:

  • 保持插入的順序,或
  • 保持在屬性根據一些排序規則進行排序;例如升序。

從下你的評論真的只想輸出在有序的屬性。這是一個更簡單的問題,可以通過自定義序列化DOM的代碼來解決。 Andreas_D解釋瞭如何使用JDOM來完成此操作,並且可能還有其他選項。

另一個問題是,如果某個工具的輸入中的屬性順序對其行爲方式產生重大影響,則某些內容可能會被破壞。由於XML的訂單屬性是應該是無顯著 ...

+0

我還沒有意識到,但這樣的排序可能是一個XML輸出的選項 - 他們知道如何縮進(漂亮的打印),爲什麼不提供按名稱排序屬性? –

+0

我們使用java爲c#wpf設計器生成xaml文件。這位設計師是我們的XML編輯器,如果屬性是按順序的話,它會很好。我們不能在那裏實現自己的排序,如果可能的話,我們希望避免在生成過程中添加另一個解析/排序步驟。 – Markus

3

下面是創建基於JDOM的自定義輸出器一個簡單的方法:

JDOM使用XmlOutputter到DOM轉換成文本輸出。屬性使用方法打印:

protected void printAttributes(Writer out, List attributes, Element parent, 
           NamespaceStack namespaces) throws IOException 

正如您所看到的,屬性傳遞給一個簡單的列表。的(簡單的)想法是將繼承這個輸出器和覆蓋的方法:

@Override 
protected void printAttributes(Writer out, List attributes, Element parent, 
           NamespaceStack namespaces) throws IOException { 
    Collections.sort(attributes, new ByNameCompartor()); 
    super.printAttributes(out, attribute, parent, namespaces); 
} 

比較的實現不應該是困難的。

+0

peshkira指出你可以爲元素添加一個排序的屬性列表。 element.setAttributes(List)。 更簡單,像魅力一樣工作。 – Markus

+0

不能保證添加排序列表適用於每個DOM實現。該元素可以將屬性存儲在散列映射中,並「刪除」列表順序。 –