一個XML子樹可能重複:
How to canonicalize WSDL files in Java?排序在Java中
我需要重新安排使用Java一些XML節點。實際上,我需要to canonicalize a WSDL file,但一些手工重新排序也應該如此。我知道,我可以使用org.w3c.dom.Document
並遍歷所有的孩子等,但它是非常繁瑣的(NodeList
甚至不是Iterable
),我不知道是否有什麼可用。
一個XML子樹可能重複:
How to canonicalize WSDL files in Java?排序在Java中
我需要重新安排使用Java一些XML節點。實際上,我需要to canonicalize a WSDL file,但一些手工重新排序也應該如此。我知道,我可以使用org.w3c.dom.Document
並遍歷所有的孩子等,但它是非常繁瑣的(NodeList
甚至不是Iterable
),我不知道是否有什麼可用。
我會這樣做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
,如果你有混合內容,這將變得非常混亂。
這看起來不錯,只是比較器需要訪問屬性「name」而不是元素的名稱。 – maaartinus
你已經做出了第一步,即認識到在類似於DOM的接口的Java中完成這種工作是極其乏味的。現在進行下一步 - 在XSLT中更容易。
我建議你先結帳我的回答http://stackoverflow.com/questions/6446904/how-to-canonicalize-wsdl-files-in-java –
也許你應該迭代,並創建一個新的文件。 – Dimitri
**顯然,這不是重複的,只是一個相關的問題。**這個問題是關於排序,另一個是關於WSDL規範形式的樣子(以及是否有工具在做)。 – maaartinus