Dom4J在写文件时保留空格

时间:2011-10-17 14:10:09

标签: java xml dom4j

我正在使用一个使用Dom4J来编写xml文件的程序。我写的数据库模式有一个方便的xml验证和导入模式。 Dom4J工作得很好,但是,我似乎无法弄清楚如何在Dom4J的XMLWriter类中设置'preserve'字段。我有一个特殊的元素,我需要编码'\ 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。

1 个答案:

答案 0 :(得分:3)

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

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

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

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

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

2)确定要“重新转义”的新行字符,并将DefaultEntity("#10")属性resolveEntityRefs设置为XMLWriter时将其替换为false节点}}。此选项意味着将现有的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时使用的输出格式如何,都应保留明确添加的换行符。

很抱歉这个混乱。