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 回答