0

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

4

1 回答 1

1

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

Java 模型 (Foo)

下面是一个具有一个String属性的简单 Java 模型。

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

}

输入.xml/输出

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

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

更新

如果您的属性XmlAdapter通过@XmlJavaTypeAdapter注释与之关联,那么这可以解释行为。

折叠字符串适配器

当 JAXB 模型从 XML Schema 生成并且节点是类型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>

规范化字符串适配器

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

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

你会得到以下输出:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
    <bar>         A         B         C     </bar>
</foo>
于 2013-05-22T13:07:13.223 回答