让我们考虑以下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视为文本内容,将其保留在文档中。

related question中,我发布了解决方法:
items_parent.setTextContent("");

它将删除这些空白行。但这是一些技巧,它消除了影响,而不是原因。

因此,问题在于消除原因:如何以换行为目的移除子项?

最佳答案

元素前的“缩进”和元素后的“回车”(以及缩进)是文本节点。如果删除某个元素,并且在该元素之前或之后有一个文本节点,则自然不会删除这些节点。

听起来好像您要删除元素,然后再删除它前面的文本节点(前提是它完全由空格组成)。

例如,也许遵循以下原则(在您的循环中删除项目):

 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文档中包含多余的空白文本节点。

10-07 13:20
查看更多