9

次の XML ドキュメントについて考えてみましょう。

<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);

ファイルの新しい内容:

<items>


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

これらの迷惑な空白行removeChild()は子を削除するために表示されますが、削除された子のインデントと改行も残ります。そして、この indent_and_like_break はテキストコンテンツとして扱われ、ドキュメントに残されます。

関連する質問で、回避策を投稿しました:

items_parent.setTextContent("");

これらの空白行を削除します。しかし、これはハックの一種であり、原因ではなく結果を取り除きます。

したがって、問題は原因を取り除くことです:改行を使用して意図的に子を削除する方法は?

4

2 に答える 2

15

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

要素を削除してから、その前にあるテキスト ノードも削除するように聞こえます (完全に空白で構成されている場合)。

たとえば、おそらく次の行に沿って(ループでアイテムを削除します):

 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);

しかし、実際の問題はおそらく、XML ドキュメントに不要な空白テキスト ノードが含まれている理由です。

于 2013-01-10T10:01:55.060 に答える
1

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

私がお勧めするのは、通常、フォーマットに関係なく最初にファイルを操作することです (有効な xml ファイルを取得するだけです)。その後、ドキュメント全体に対していつでもフォーマッタを実行して、目的のフォーマットを取得できます。

于 2013-01-10T09:59:58.440 に答える