【问题标题】:How should I deal with linebreaks in strings I want to marshal in Java to XML?我应该如何处理要在 Java 中编组为 XML 的字符串中的换行符?
【发布时间】:2013-08-07 16:21:25
【问题描述】:

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

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

Foo <LF>
bar

或者一个额外的例子:

Foo\r\n\r\nBar

产量:

Foo&#xD;
&#xD;
Bar

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

Foo &amp;amp;#xD;bar

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

Foo &amp;amp;#xD;bar

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

【问题讨论】:

  • 您需要告诉我们您是如何编写 XML 文件的,您显然正在使用某种机制来翻译特殊字符,而插入特殊字符的方式将取决于该机制。这是一个重要的细节,否则我只会告诉你 fileWriter.write(" ") 工作得很好。
  • 好的,代码正在使用javax.xml.bind.Marshaller 编写XML。我创建了一个模式,然后使用xjc.exe 对其进行编译。希望这是足够的信息?
  • 文字新行在 element 内容中很好,并且在属性中,编组器应在必要时自动将它们编码为&amp;#10;,因此它应该按原样工作。
  • Interesting @IanRoberts...我继承了这个软件,他们已经实现了这个程序来将文字 LF 字符转换为字符串#xA...请注意,它的时间和地点非常不一致确实如此,但现在我正在与外部开发人员合作,以确保我们的两个工具都保持数据完整性。我应该在元素内容中保留文字换行符吗?我什至看到其他人建议用\n 替换。也许您可以参考我们的标准,表明可以在元素内容中使用文字换行符。 :-)

标签: java xml jaxb marshalling


【解决方案1】:

下面是 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) 实现通用

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

EclipseLink JAXB (MOXy)

JAXB 参考实现

  • 在编组到 OutputStream 时,JAXB 参考实现将正确转义“\r”,但至少在我正在使用的 JDK 中不会转义到 Writer

【讨论】:

  • 谢谢你。我浏览了代码,发现默认 Marshaller 对象有一些变化——即我们调用setSchema,将JAXB_FRAGMENT 设置为true,将JAXB_FORMATTED_OUTPUT 设置为true。这些中的任何一个是否会导致返回文字换行符?或者您的输出是否暗示 XML 输出中的文字换行符是处理 \r 的结果?
  • @deed02392 - 我已根据对此问题的调查结果更新了我的答案。
  • 这很棒。就我而言,我直接编组到FileOutputStream。我的输入字符串有Foo\r\n\r\nBar,我最终得到Foo&amp;#xD;(NL) &amp;#xD;(NL) Bar。那这样对吗?我以为我理解 XML 应该将 \r\n 序列减少为单个 \n 并对其进行编码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-01
  • 2015-04-30
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 1970-01-01
相关资源
最近更新 更多