可以在不使用CharacterEscapeHandler的情况下使用CDATA在JAXB中进行封送和解组

时间:2013-05-22 10:58:42

标签: java xml jaxb jaxb2

我不想使用CharacterEscapeHandler。不知何故,在使用JAXB进行编组和解组之后,需要在java字符串(它将成为XML属性)中使用换行符(\ n)。尝试将Marshaller中的编码属性更改为Unicode和ASCII,但它不起作用。在编组之后,按预期逐个出现多行文本。但是在解散之后,所有的线都在同一条线上(被包裹起来)。 使用CDATAAdapter和CharacterEscapeHandler解决了这个问题,但我想知道一种不使用CharacterEscapeHandler的方法。 请回复是否有一种方法可以在XML属性中的unmarshall之后保留\ n字符,而不是使用空格。提前致谢

1 个答案:

答案 0 :(得分:1)

默认情况下,JAXB (JSR-222)实现不会删除任何换行符。

Java模型(Foo)

下面是一个简单的Java模型,其中包含一个String属性。

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement
public class Foo {

    private String bar;

    public String getBar() {
        return bar;
    }

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

}

<强>演示

下面的演示代码将XML转换为对象,然后将其写回XML。

import java.io.File;
import javax.xml.bind.*;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum16690011/input.xml");
        Foo foo = (Foo) unmarshaller.unmarshal(xml);

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(foo, System.out);
    }

}

<强> input.xml中/输出

输入和输出都包含换行符。

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <bar>
        A
        B
        C
    </bar>
</foo>

<强>更新

如果您的媒体资源通过XmlAdapter注释与@XmlJavaTypeAdapter相关联,则可以解释此行为。

<强> CollapsedStringAdapter

当从XML Schema生成JAXB模型并且节点类型为xs:token时,它将被注释为:

@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
public String getBar() {
    return bar;
}

您将获得以下输出:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo>
    <bar>A B C</bar>
</foo>

<强> NormalizedStringAdapter

当从XML Schema生成JAXB模型并且节点类型为xs:normalizedString时,它将被注释为:

@XmlJavaTypeAdapter(NormalizedStringAdapter.class)
public String getBar() {
    return bar;
}

您将获得以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <bar>         A         B         C     </bar>
</foo>