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

时间:2013-08-07 16:21:26

标签: java xml jaxb marshalling

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

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

Foo <LF>
bar

或另外一个例子:

Foo\r\n\r\nBar

收率:

Foo&#xD;
&#xD;
Bar

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

Foo &#xD;bar

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

Foo &amp;#xD;bar

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

1 个答案:

答案 0 :(得分: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;
    }

}

演示代码

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)实施的共同点

  • 如果您直接(XMLStreamWriter)或间接(通过可能是JAX-RS或JAX-WS提供商)编组为XMLEventWriterMarshaller,则转发将基于关于StAX实现。 Woodstox似乎正确地解决了问题,但我正在使用的JDK中的StAX实现没有。

EclipseLink JAXB(MOXy)

JAXB参考实施

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