我应该如何处理我想用Java编写XML的字符串中的换行符?

dee*_*392 6 java xml jaxb marshalling

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

我很难使用Java和JAXB来处理将字符串放入包含换行符的XML文件中.数据将从数据库中提取,其中包含实际的换行符.

Foo <LF>
bar
Run Code Online (Sandbox Code Playgroud)

或者另外一个例子:

Foo\r\n\r\nBar
Run Code Online (Sandbox Code Playgroud)

产量:

Foo&#xD;
&#xD;
Bar
Run Code Online (Sandbox Code Playgroud)

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

Foo &#xD;bar

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

Foo &amp;#xD;bar

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

bdo*_*han 5

下面是JAXB关于\n和的默认行为的示例\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;
    }

}
Run Code Online (Sandbox Code Playgroud)

演示代码

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

产量

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><root><bar>Hello
World</bar><foo>Hello&#xD;World</foo></root>
Run Code Online (Sandbox Code Playgroud)

UPDATE

以下是基于我所做的一些调查的一些其他细节.

所有JAXB(JSR-222)实现的共同点

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

EclipseLink JAXB(MOXy)

JAXB参考实现

  • 当编组到a时OutputStream,JAXB参考实现将正确地转义'\ r' ,而不是Writer我正在使用的JDK中的至少.