使用 dom4j 删除 XML 节点后回写文件出现空白行的清除方法

一、前言

    对于 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文件情况

说明:根据以上示例,发现删除后回写的 XML 中出现了许多空白行,其实仔细发现,这些空白行正式删除掉的那些节点行,如果删除的节点行数越多,将会出现更多的空白行。

三、空白行清除方法

    在上面的示例中,使用的是 Documentwrite() 方法回写,直接回写并未格式化,所以出现了空白行。其实 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 文件效果
    回写 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():紧凑的打印格式,节点连在一起,可读性低。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值