让我们考虑以下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("");
它将删除这些空白行。但这是一些技巧,它消除了影响,而不是原因。
因此,问题在于消除原因:如何以换行为目的移除子项?
最佳答案
元素前的“缩进”和元素后的“回车”(以及缩进)是文本节点。如果删除某个元素,并且在该元素之前或之后有一个文本节点,则自然不会删除这些节点。
听起来好像您要删除元素,然后再删除它前面的文本节点(前提是它完全由空格组成)。
例如,也许遵循以下原则(在您的循环中删除项目):
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文档中包含多余的空白文本节点。