【问题标题】:removeChild() : how to remove indent too?removeChild() : 如何删除缩进?
【发布时间】:2012-12-24 16:07:14
【问题描述】:

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

它会删除这些空行。但这是一种技巧,它消除了结果,而不是原因。

所以,问题是关于消除原因:如何用换行符的意图删除子项?

【问题讨论】:

  • 检查this
  • 谢谢,这解决了我的问题。您可以将其添加为答案,我会接受。或者,这个问题实际上并不正确,所以,可能将其标记为重复甚至删除,不确定..
  • 如果您喜欢,请为链接的问题投票
  • @MadProgrammer,当然,我已经在没有你提及的情况下对问题和答案都投了赞成票。

标签: java xml dom removechild


【解决方案1】:

实际上,XML 文档不必遵循任何样式准则。因此,您不能只使用文档操作方法来为您的文档保留某种样式。

我的建议通常是首先处理您的文件而不考虑格式(然后获取一个有效的 xml 文件),然后您可以随时在整个文档上运行格式化程序以获得所需的格式。

【讨论】:

  • 是的,你是对的。 MadProgrammer的链接为我解决了麻烦,您的方法是正确的。
【解决方案2】:

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

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

例如,也许沿着这些思路(在您的循环中删除项目):

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

【讨论】:

  • 谢谢,您的解决方案适用于真正删除元素前的缩进!哦,我很困惑:你给了我关于我的问题的确切答案,但现在我明白这种(我的)方法似乎很老套……我的错。对不起。不知道我应该接受什么答案:)
  • prev.getNodeValue().trim() 是一个字符串,因此 prev.getNodeValue().trim().length 应更改为 prev.getNodeValue().trim().length()。否则,很好的答案-对我帮助很大。 +1
猜你喜欢
  • 2019-09-22
  • 1970-01-01
  • 2013-10-30
  • 2019-07-11
  • 2011-09-21
  • 1970-01-01
  • 2023-04-09
  • 1970-01-01
  • 2013-12-01
相关资源
最近更新 更多