1

これはおそらく対処するのが最も簡単なことの1つですが、何らかの理由で私にとってはうまくいきません. dom ツリーのルートの後に新しいノードを追加しようとしています。
元の文字列は次のとおりです。

<div class="discussionThread dt"><div class="dt_subject">2011 IS HERE!</div></div>

前に文字列の形式の新しいノードを追加しようとしています。最終バージョンは次のようになります。

<div class="discussionThread dt"><div class="test">Test Val</div><div class="dt_subject">2011 IS HERE!</div></div>

ご覧のとおり、ルート div クラスの直後に新しいTest Valが追加されています。ノードを適切な場所に配置するためにいくつかの方法を使用しましたが、最後に追加されます。

これは、以前の投稿の 1 つから参照したサンプルです。

String newNode = "<div class="test">test</div>";
SAXReader reader = new SAXReader();
Document newNodeDocument = reader.read(new StringReader(newNode));
Document originalDoc = new SAXReader().read(new StringReader(content));
Element root = originalDoc.getRootElement();
Element givenNode = originalDoc.getRootElement(); 
givenNode.add(newNodeDocument.getRootElement());

これにより、ノードが最後に追加されます。insertBefore() を使用してみましたが、うまくいきませんでした。

どんな指針も高く評価されます。

ありがとう

4

3 に答える 3

3

Document新規または新規ルートをElement作成する理由 最短の方法は次を使用していると思いますBranch#content

このブランチのコンテンツ ノードをバッキング リストとして返し、このブランチのコンテンツをインターフェイスを使用して直接変更できるようにします。リストはブランチによってサポートされているため、リストへの変更はブランチに反映され、その逆も同様です。

List新しい要素を作成し、提供されたメソッドを介してルート要素に追加するだけですcontent(位置インデックスを渡します)。これが私のメインです:

public static void main(String[] args) throws DocumentException {

    SAXReader reader = new SAXReader();
    String xml = "<div class=\"discussionThread dt\"><div class=\"dt_subject\">2011 IS HERE!</div></div>";
    Document document = reader.read(new StringReader(xml));

    DefaultElement newElement = new DefaultElement("div");
    newElement.addAttribute("class", "test");
    newElement.add(new DefaultText("Test Val"));

    List content = document.getRootElement().content();
    if (content != null ) {
        content.add(0, newElement);
    }

    System.out.println(document.asXML());
}

次のxmlを出力します。

<div class="discussionThread dt"><div class="test">Test Val</div><div class="dt_subject">2011 IS HERE!</div></div>

さらに、xml を変換する必要がある場合は、xslt の使用も考慮する必要があります。

于 2011-04-06T21:57:04.803 に答える
2

を呼び出していますElement#add(Entity)。Javadoc から:

Entity指定された をこの要素に追加します。指定されたノードにすでに親が定義されている場合は、IllegalAddExceptionがスローされます。

したがって、追加する新しいノードは、追加先のノードのとして追加されます。ドキュメントにはルート ノードが 1 つしかないため、ルート ノードの後に​​別のノードを追加することはできません。

できることは、新しいルート ノードを作成し、古いルート ノードと新しいノードをこの新しいルート ノードの子として追加することです。次に、ドキュメントのルート ノードを新しいルート ノードに設定します。

于 2011-04-06T19:43:59.010 に答える
1

必要な値で新しいドキュメントを作成してから、他のノードを追加してみませんか?

于 2011-04-06T19:47:05.250 に答える