我应该如何处理我想要编组为XML的字符串中的换行符?
我很难使用Java和JAXB来处理将字符串放入包含换行符的XML文件中。数据将从数据库中提取,其中包含实际的换行符。
Foo <LF>
bar
或另外一个例子:
Foo\r\n\r\nBar
收率:
Foo

Bar
如果我只是将这些数据编组为XML,我会在输出中获得文字换行符。这显然违反了XML标准,其中字符应编码为
。即在XML文件输出中,我应该看到:
Foo 
bar
但是,如果我尝试手动执行此操作,最终我的&符号会被编码!
Foo &#xD;bar
这很具有讽刺意味,因为显然应该首先对换行符进行编码而不是编码换行符的过程正在挫败我手动编码的尝试。
答案 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
World</foo></root>
以下是基于我所做的一些调查的其他一些细节。
所有JAXB (JSR-222)实施的共同点
XMLStreamWriter
)或间接(通过可能是JAX-RS或JAX-WS提供商)编组为XMLEventWriter
或Marshaller
,则转发将基于关于StAX实现。 Woodstox似乎正确地解决了问题,但我正在使用的JDK中的StAX实现没有。EclipseLink JAXB(MOXy)
\r
相关的错误,我目前正在修复此问题(请参阅:http://bugs.eclipse.org/414608)JAXB参考实施
OutputStream
时,JAXB参考实现将正确地转义'\ r',而不是在我正在使用的JDK中至少Writer
转义。