removeChild():如何删除缩进?

时间:2013-01-10 09:56:31

标签: java xml dom removechild

让我们考虑以下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("");

删除这些空白行。但这是一些黑客攻击,它消除了影响,而不是原因。

所以,问题是如何消除原因:如何通过换行来删除孩子?

2 个答案:

答案 0 :(得分:14)

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

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

,也许沿着这些方向(在你的循环中删除项目):

 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文档中有无关的空白文本节点的原因。

答案 1 :(得分:1)

实际上,XML文档不必遵循任何样式指南。因此,除了文档操作方法之外,您不能为文档保留某种样式。

我建议通常首先操作你的文件而不考虑格式(然后只获得一个有效的xml文件)然后你总是可以在整个文档上运行一个格式化程序来获得你想要的格式。