在Java中对XML子树进行排序

时间:2011-06-23 11:44:44

标签: java xml

  

可能重复:
  How to canonicalize WSDL files in Java?

我需要使用Java重新排序一些XML节点。实际上,我需要to canonicalize a WSDL file,但也应该做一些手工制作的重新排序。

我知道,我可以使用org.w3c.dom.Document并遍历其所有子项等等,但这很乏味(NodeList甚至不是Iterable)而且我想知道是否有什么东西可用的。

2 个答案:

答案 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中更容易。