JAXB多行属性

时间:2014-01-03 04:36:41

标签: java xml jaxb jaxb2

有没有办法对mamlhall / unmarshall xml / object多行属性进行编组。

目前显示为

<task name="Payament Gateway
Checker" >

如果通过用\ n?

替换nextline空格来存储它是最好的
<task name="Payament Gateway \n Checker" >

修改 -

尝试了适配器和JaxbListener - 但转换为name =“Payament Gateway&amp; #xA; Checker”

void beforeMarshal(Marshaller marshaller) {
 name = name.replaceAll("\n", "&#xA;");    
 }

@XmlJavaTypeAdapter(MultilineString.class)
    @XmlAttribute
    protected String name;

public class MultilineString extends XmlAdapter<String, String> {
    @Override
    public String marshal(String input) throws Exception {
        return input.replaceAll("\n", "&#xA;");
    }
    @Override
    public String unmarshal(String output) throws Exception {
        return output;
    }
}

1 个答案:

答案 0 :(得分:4)

TL; DR

JAXB应该用\n替换Java &#xA;,这是正确的XML转义。如果您没有看到这个,那么您正在使用的JAXB实现版本中可能存在错误。例如,版本2.5.1中的EclipseLink JAXB (MOXy)修复了此问题:


实施例

Java模型(Foo)

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Foo {

    private String bar;

    @XmlAttribute
    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(Foo.class);

        Foo foo = new Foo();
        foo.setBar("Hello\nWorld");

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

}

<强>输出

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<foo bar="Hello&#xA;World"/>

解决方法

您始终可以使用XmlAdapter来控制JAXB中的任何输出。

相关问题