7

我应该如何处理要编组为 XML 的字符串中的换行符?

我在使用 Java 和 JAXB 处理将字符串放入其中包含换行符的 XML 文件时遇到了困难。数据是从数据库中提取的,其中包含实际的换行符。

Foo <LF>
bar

或者一个额外的例子:

Foo\r\n\r\nBar

产量:

Foo&#xD;
&#xD;
Bar

如果我只是将这些数据编组为 XML,我会在输出中得到文字换行符。这显然违反了字符应编码为 .xml 的 XML 标准&#xD;。即在 XML 文件输出中我应该看到:

Foo &#xD;bar

但是,如果我尝试手动执行此操作,最终我的 & 符号会被编码!

Foo &amp;#xD;bar

这非常具有讽刺意味,因为显然应该首先对换行符进行编码而不是进行编码的过程正在挫败我手动对其进行编码的尝试。

4

1 回答 1

5

以下是 JAXB 关于\nand的默认行为示例\r

Java 模型(根)

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Root {

    private String foo;
    private String bar;

    public String getFoo() {
        return foo;
    }

    public void setFoo(String foo) {
        this.foo = foo;
    }

    public String getBar() {
        return bar;
    }

    public void setBar(String bar) {
        this.bar = bar;
    }

}

演示代码

import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(Root.class);

        Root root = new Root();
        root.setFoo("Hello\rWorld");
        root.setBar("Hello\nWorld");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.marshal(root, System.out);
    }

}

输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root><bar>Hello
World</bar><foo>Hello&#xD;World</foo></root>

更新

以下是基于我所做的一些调查的一些额外细节。

所有JAXB (JSR-222)实现通用

  • 如果您正在编组到XMLStreamWriterXMLEventWriter直接(通过Marshaller)或间接(通过可能的 JAX-RS 或 JAX-WS 提供程序),则转义将基于 StAX 实现。Woodstox 似乎正确地逃避了事情,但我正在使用的 JDK 中的 StAX 实现没有。

EclipseLink JAXB (MOXy)

  • MOXy 中有一个与转义相关的错误\r,我目前正在修复(参见:http ://bugs.eclipse.org/414608 )

JAXB 参考实现

  • JAXB 参考实现将在编组到时正确转义 '\r' OutputStream,但Writer在我正在使用的 JDK 中至少不会转义。
于 2013-08-07T18:14:46.717 回答