【问题标题】:Dom4J preserve whitespace when writing fileDom4J 在写入文件时保留空格
【发布时间】:2011-12-09 08:22:34
【问题描述】:

我正在开发一个使用 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。

【问题讨论】:

  • 我无法帮助您,但也许您到目前为止尝试/获得的一些代码/配置文件示例会帮助其他使用 DOM4J 的人来帮助您。
  • @awfulHack 查看更新的答案。

标签: java xml dom4j


【解决方案1】:

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

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

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

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

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

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

似乎选项 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 时使用何种输出格式,都应保留您明确添加的换行符。

很抱歉给您带来了困惑。

【讨论】:

  • #2 绝对是要走的路,因为我是添加“\n”以将我的旧数据源中的两个不同字段合并到一个 xml 元素中的人。明天我会试一试——非常感谢。 -唐
  • @awfulHack 好吧,这让它变得容易多了,而且不是那么糟糕的黑客攻击。对不起,无法抗拒:-)
猜你喜欢
  • 1970-01-01
  • 2018-10-07
  • 1970-01-01
  • 2020-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
相关资源
最近更新 更多