2011-06-23 34 views
1

一個XML子樹可能重複:
How to canonicalize WSDL files in Java?排序在Java中

我需要重新安排使用Java一些XML節點。實際上,我需要to canonicalize a WSDL file,但一些手工重新排序也應該如此。我知道,我可以使用org.w3c.dom.Document並遍歷所有的孩子等,但它是非常繁瑣的(NodeList甚至不是Iterable),我不知道是否有什麼可用。

+0

我建議你先結帳我的回答http://stackoverflow.com/questions/6446904/how-to-canonicalize-wsdl-files-in-java –

+0

也許你應該迭代,並創建一個新的文件。 – Dimitri

+1

**顯然,這不是重複的,只是一個相關的問題。**這個問題是關於排序,另一個是關於WSDL規範形式的樣子(以及是否有工具在做)。 – maaartinus

回答

2

我會這樣做dom4j。一個dom4j Element提供了live List view of its sub-elements,你可以排序。並配有Visitor可以修改整個文檔:

Document document = DocumentHelper.parseText(someXml); 
final Comparator<Element> comparator = new Comparator<Element>() { 
    public int compare(Element o1, Element o2) { 
     return o1.getName().compareTo(o2.getName()); 
    } 
}; 
Visitor visitor = new VisitorSupport() { 
    @Override 
    public void visit(Element node) { 
     @SuppressWarnings("unchecked") // dom4j doesn't know generics yet 
     List<Element> elements = node.elements(); 
     Collections.sort(elements, comparator); 
     super.visit(node); 
    } 
}; 
document.accept(visitor); 
// now write the document back to a file 

它沒有得到比這更容易。


更新:試圖很久以後用我自己的解決方案後,我意識到,它不工作的方式。由Element.elements()返回的列表不喜歡Collections.sort(),因此您將不得不使用由Element.content()返回的列表。不幸的是,這意味着你的比較器將不得不處理Node,而不是Element,如果你有混合內容,這將變得非常混亂。

+0

這看起來不錯,只是比較器需要訪問屬性「name」而不是元素的名稱。 – maaartinus

2

你已經做出了第一步,即認識到在類似於DOM的接口的Java中完成這種工作是極其乏味的。現在進行下一步 - 在XSLT中更容易。