一、前言
对于 dom4j 大家应该都非常了解,他是一个灵活的 XML 框架库,可以解析并修改 XML 的内容。
二、情景再现
在使用 dom4j 处理 XML 时,如果删除了 XML 中的某些节点,再次回写文件时,会发现回写之后的文件出现了许多空白行。如下示例:
- 示例 XML
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string name="string1">我是文本1</string>
<string name="string2">我是文本2</string>
<string name="string3">我是文本3</string>
<string name="string4">我是文本4</string>
<string name="string5">我是文本5</string>
<string name="string6">我是文本6</string>
<string name="string7">我是文本7</string>
<string name="string8">我是文本8</string>
<string name="string9">我是文本9</string>
<string name="string10">我是文本10</string>
</resources>
- dom4j修改 XML 代码
val file = File("F:/strings.xml")
val document = SAXReader().read(File("F:/strings.xml"))
val rootElement = document.rootElement
val eIt = rootElement.elementIterator()
var element: Element
var attrValue: String
while (eIt.hasNext()) {
element = eIt.next()
attrValue = element.attribute("name").value
// 删除 name 属性符合指定条件的某些节点
if(attrValue == "string3" || attrValue == "string5" || attrValue == "string7") {
println("Removing ${element.name} with attribute name = $attrValue ----- ${rootElement.remove(element)}")
}
}
// 重新写入文件
val out = FileWriter(File(file.parent, "new_${file.name}"))
document.write(out)
out.close()
- 回写 XML 文件情况
说明:根据以上示例,发现删除后回写的 XML 中出现了许多空白行,其实仔细发现,这些空白行正式删除掉的那些节点行,如果删除的节点行数越多,将会出现更多的空白行。
三、空白行清除方法
在上面的示例中,使用的是 Document
的 write()
方法回写,直接回写并未格式化,所以出现了空白行。其实 dom4j 这个库已经提供了格式化回写文件的方法,那就是使用 XMLWriter
类回写 XML 文件。如下所示:
val file = File("F:/strings.xml")
val document = SAXReader().read(File("F:/strings.xml"))
val rootElement = document.rootElement
val eIt = rootElement.elementIterator()
var element: Element
var attrValue: String
while (eIt.hasNext()) {
element = eIt.next()
attrValue = element.attribute("name").value
// 删除 name 属性符合指定条件的某些节点
if(attrValue == "string3" || attrValue == "string5" || attrValue == "string7") {
println("Removing ${element.name} with attribute name = $attrValue ----- ${rootElement.remove(element)}")
}
}
// 重新写入文件
val out = FileWriter(File(file.parent, "new_${file.name}"))
// 这里使用 XMLWriter的格式化输出,会去掉删除掉节点留下的空白行
XMLWriter(out, OutputFormat.createPrettyPrint()).write(document)
out.close()
- 回写 XML 文件效果
使用
XMLWriter
类的格式化回写文件,使用给定的输出格式,可以实现删除空白行的。
四、OutputFormat
简单介绍
OutputFormat
是用于 XML 输出格式化的,在OutputFormat
中已经预定义了两个类型的格式化输出,分别是 OutputFormat.createPrettyPrint()
(优美的打印格式) 和 OutputFormat.createCompactFormat()
(紧凑的格式),他们的生成代码如下:
public static OutputFormat createPrettyPrint() {
OutputFormat format = new OutputFormat();
format.setIndentSize(2); // 缩进空格个数
format.setNewlines(true); // 新行
format.setTrimText(true); // 修剪文字
format.setPadText(true); // 文字填充
return format;
}
public static OutputFormat createCompactFormat() {
OutputFormat format = new OutputFormat();
format.setIndent(false); // 缩排
format.setNewlines(false); // 新行
format.setTrimText(true); // 修剪文字
return format;
}
OutputFormat.createPrettyPrint()
:优美的打印格式,节点新行等,可读性高。OutputFormat.createPrettyPrint()
:紧凑的打印格式,节点连在一起,可读性低。