java - removeChild(): how to remove indent too?

标签 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("");

它删除了这些空行。但这是一些 hack 的问题,它消除了结果,而不是原因。

所以,问题是关于消除原因:如何用换行符删除带有 intent 的 child?

最佳答案

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

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

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

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

关于java - removeChild(): how to remove indent too?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14255064/

相关文章:

java - 从 java 代码中运行已编译的 java .class 文件并捕获输出

java - Java 中的正则表达式 : Not able to to detect newlines using ^ in a multiline mode

xml - Lisp 数据格式化为 xml

jquery - 我如何使用 jQuery 处理这个递归菜单中的悬停?

javascript - DIV 节点怎么会是 "detached",有什么用?

java - 在 O(log) 时间内计算没有幂函数的 Java 幂

java8 简化映射转换

c# - XDocument 通过其名称属性的值获取 XML 元素

java - 使用动态元素进行 JAXB 解码

javascript - 为什么 colspan 不是 Angular 2 中已知的原生属性?