java - Dom4J 在写入文件时保留空格

标签 java xml dom4j

我正在开发一个使用 Dom4J 编写 xml 文件的程序。我正在写入的数据库模式有一个方便的 xml 验证和导入模式。 Dom4J 运行良好,但是,我似乎无法弄清楚如何在 Dom4J 的 XMLWriter 类中设置“保留”字段。我有一个特定的元素,我需要在其中保留编码的 '\n'。

这个类的 javadoc 文档有点不足 http://dom4j.sourceforge.net/dom4j-1.6.1/apidocs/org/dom4j/io/XMLWriter.html

我试过玩弄 OutputFormat 对象,但没有骰子。

谁能告诉我如何确保 XMLWriter 对象在写入文件时保留 dom4j 树元素的空白。

谢谢,

唐纳德

假设我从:

Element accession = factory.createElement("title"); 
List<String> AUT = new ArrayList<String>;
AUT.add("author1");
AUT.add("author2");
String title = "Title";

我希望输出类似于:

<title>author1
author2
Title</title>

将行返回编码到标题字段中。

DefaultEntity e = new DefaultEntity("#10");
if(AUT.size() > 1) {
  for(String a : AUT) {
    accession.addText(a);
    accession.add(e);
  }
accession.addText(title);
}

这不起作用,因为它是 IllegalAddException。

最佳答案

首先,“preserve”属性与保留先前编码字符的编码无关——而是与保留元素中包含的空格有关。此属性通常由 xml:space="preserve" 属性控制。

但是,如果您的用例是您的输入中有一个编码的换行符,并且您希望将其保留在输出中,那么您就有麻烦了。 DOM4J 会将所有实体和字符引用解码为其对应的 Java 字符 (UTF-16)。这可以通过配置底层 XMLreader 来部分控制,但据我所知,没有 XMLReader 会报告字符引用的开始和结束——这些将被它们相应的字符值默默地替换。

在输出时,XMLWriter 将只对那些需要编码的字符进行编码,无论是因为 XML 规则还是因为序列化时使用的编码(例如 UTF-8 或 ISO-8859-1 等)。

在这种情况下,您基本上有两种选择。

1) 子类 XMLWriter 并完全替换 characters() 方法,因为空白的处理实际上是该方法固有的。没有其他方法可以拦截制表符、换行符或回车符的写入。在这里,您必须以某种方式跟踪您的位置并识别您正在处理正确的换行符

2) 在设置 resolveEntityRefs 时,确定要“重新转义”的换行符并用 DefaultEntity("#10") 节点替换它> XMLWriter 的属性设置为 false。此选项意味着将现有文本节点一分为二,并在中间插入实体节点。

似乎选项 2 涉及较少的工作,但仍然很麻烦

更新:

好吧,看来你不能添加相同的实体两次。如果每次工作时都添加一个新的实体实例。但是,您的案例可以通过添加 xml:space="preserve" 到您的元素来解决。

    if (AUT.size() > 1) {
        for (String a : AUT) {
            accession.addText(a);
            accession.addText("\n");
        }
        accession.addText(title);
    }

然后

    accession.addAttribute(QName.get("space", Namespace.XML_NAMESPACE),
            "preserve");

在这种情况下,无论写入 xml 时使用的输出格式如何,都应保留显式添加的换行符。

抱歉造成混淆。

关于java - Dom4J 在写入文件时保留空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7795009/

相关文章:

java - gson解析嵌套的json对象

java - 在 macOS Cocoa 应用程序中嵌入可执行 jar 文件

javascript - 插入流式 XML 数据数据库

Java - XML 解析器性能 : Sun Java Streaming XML Parser (SJSXP) vs Woodstox

Python 的 libxml2 无法解析 unicode 字符串

java - 使用 DOM4J 读取 XML 元素内容

java - 如何在 Java 中存储仅需要 'contains' 操作的巨大静态/不可变字符串集

java - Android ListActivity 行颜色基于对象状态

java - DOM4J 文档 : read an ISO-8859-1 xml

java - Dom4j:编译时出现错误 "incompatible types"