让我们考虑以下 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/