我需要使用Java重新排序一些XML节点。实际上,我需要to canonicalize a WSDL file,但也应该做一些手工制作的重新排序。
我知道,我可以使用org.w3c.dom.Document
并遍历其所有子项等等,但这很乏味(NodeList
甚至不是Iterable
)而且我想知道是否有什么东西可用的。
答案 0 :(得分: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
,如果你有混合内容,这将变得非常混乱。
答案 1 :(得分:2)
你已经迈出了第一步,即认识到使用类似DOM的接口在Java中完成这种工作是极其繁琐的。现在采取下一步 - 在XSLT中更容易。