4

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

4

1 回答 1

3

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

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

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

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

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

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

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

对困惑感到抱歉。

于 2011-10-17T21:45:16.457 回答