2011-06-23 6 views
1
におけるXMLサブツリー

可能性の重複:
How to canonicalize WSDL files in Java?ソートのJava

私はJavaを使用して、いくつかのXMLノードの順序を変更する必要があります。実際にはto canonicalize a WSDL fileが必要ですが、手作業で並べ替えを行う必要があります。

私は、org.w3c.dom.Documentを使用して、すべての子供などに繰り返し使用できますが、かなり面倒です(NodeListIterableではない)。

+0

私は最初のチェックアウトをお勧めしますhttp://stackoverflow.com/questions/6446904/how-to-canonicalize-wsdl-files-in-java –

+0

あなたは新しい文書を繰り返して作成する必要があります。 – Dimitri

+1

**明らかに、これは重複するものではなく、単に関連する質問です。**この問題はソートに関するものでした。もう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()によって返されたリストを使用する必要があります。残念ながらこれは、コンパレータがElementではなくNodeを処理しなければならないことを意味します。これは、混在したコンテンツがあると非常に乱雑になります。

+0

これは、コンパレータが要素の名前の代わりに属性 "name"にアクセスする必要があるだけでいいですね。 – maaartinus

2

あなたはDOMのようなインターフェースを持つJavaでこのような仕事をするのが面倒であることを認識することになりました。今すぐ次のステップに進んでください.XSLTでははるかに簡単です。

関連する問題