2013-01-10 17 views
5

のは、次のXML文書を考えてみましょう:removeChild():インデントも削除するには?

<items> 
    <item>item1</item> 
    <item>item2</item> 
</items> 

、のすべての項目を削除し、いくつかの新しいアイテムを追加してみましょう。コード:ファイルの

//-- assume we have Element instance of <items> element: items_parent 
    // and the Document instance: doc 

    //-- remove all the items 
    NodeList items = items_parent.getElementsByTagName("item"); 

    for (int i = 0; i < items.getLength(); i++){ 
    Element curElement = (Element)items.item(i); 
    items_parent.removeChild(curElement); 
    } 

    //-- add a new one 
    Element new_item = doc.createElement("item"); 
    new_item.setTextContent("item3"); 
    items_parent.appendChild(new_item); 

新しい内容は:removeChild()が子供を削除しますが、それが削除された子のインデント葉、およびラインあまりにも壊れているため

<items> 


    <item>item3</item> 
</items> 

これらの迷惑な空白行が現れました。そして、このindent_and_like_breakは、ドキュメントに残されたテキストコンテンツとして扱われます。 related question

私は回避策を投稿:

items_parent.setTextContent(""); 

それはこれらの空白行を削除します。しかし、これはハックのいくつかの欠点です、それは原因ではなく、効果を削除します。

問題は、原因を取り除くことです。改行を伴う目的で子供を削除する方法は?

+2

[こちら](http://stackoverflow.com/questions/978810/how-to-strip-whitespace-only-text-nodes-from-a-dom-before-serialization) – MadProgrammer

+0

ありがとう、これを解決しました私の問題。あなたはこれを回答のように追加することができます。私はそれを受け入れます。または、質問は実際には正しいとは言えませんので、重複しているかどうかを確認してください。 –

+0

リンク先の質問 – MadProgrammer

答えて

12

要素の前の「インデント」とテキストノードの後の「キャリッジリターン」(および後続のインデント)。要素を削除し、その前または後にテキストノードがある場合、自然にそれらのノードは削除されません。

要素を削除し、その前にあるテキストノードを削除したい場合は(完全に空白で構成されている場合)、それは聞こえます。おそらく、これらの行(項目を削除し、あなたのループ内)に沿って

例えば、:あなたのXML文書がそれに余分な空白のテキストノードを持っている理由

Element curElement = (Element)items.item(i); 
// Start new code 
Node prev = curElement.getPreviousSibling(); 
if (prev != null && 
    prev.getNodeType() == Node.TEXT_NODE && 
    prev.getNodeValue().trim().length() == 0) { 
    items_parent.removeChild(prev); 
} 
// End new code 
items_parent.removeChild(curElement); 

しかしは、本当の問題は、おそらくする必要があります。

+0

ありがとうございます。あなたのソリューションは、要素の前にインデントを実際に削除するために機能します!ああ、私は混乱している:あなたは私の質問で私に正確な答えを与えたが、今私はこの(私の)アプローチがハッキーであるように理解する...私の悪い。ごめんなさい。私が受け入れるべき答えがわからない。 –

+0

@DmitryFrank:編集をありがとう!非常に重要なチェック... –

+1

prev.getNodeValue()。trim()は文字列なので、prev.getNodeValue()。trim()です。長さはprev.getNodeValue()。trim()。length()に変更する必要があります。そうでなければ、素晴らしい答えが私を助けました。 +1 –

1

実際にはXML文書はスタイルガイドラインに従う必要はありません。したがって、ドキュメントに何らかのスタイルを保持するために、ドキュメント操作メソッドを除外することはできません。

私がお勧めしたいのは、一般的に、フォーマットに関係なくファイルを操作することです(有効なXMLファイルを取得するだけです)。その後、ドキュメント全体にフォーマッタを実行して、必要なフォーマットを取得できます。

+0

はい、そうです。 MadProgrammerのリンクが私にとって問題を解決し、あなたのアプローチは正しいです。 –

関連する問題