public class Person {
public String name; ...
}
当我想到marhsal时,我想获得一个带有值属性
的Name节点<name value="arahant" />
而不是:
<name>arahant</name>
我怎样才能做到这一点?我试着查看XmlElementWrapper,但只允许集合。我需要为此编写自定义代码吗?
答案 0 :(得分:3)
您可以使用几种方法来支持此用例。
选项#1 - XmlAdapter
任何JAXB(JSR-222)实施
此方法适用于任何符合JAXB (JSR-222)的实现。
的 ValueAdapter 强> 的
XmlAdapter
允许您将一个对象编组,就像它是另一个对象一样。在我们的XmlAdapter
中,我们会将String
值转换为/具有一个映射为@XmlAttribute
的属性的对象。
package forum13489697;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.adapters.XmlAdapter;
public class ValueAdapter extends XmlAdapter<ValueAdapter.Value, String>{
public static class Value {
@XmlAttribute
public String value;
}
@Override
public String unmarshal(Value value) throws Exception {
return value.value;
}
@Override
public Value marshal(String string) throws Exception {
Value value = new Value();
value.value = string;
return value;
}
}
的人强> 的
@XmlJavaTypeAdapter
注释用于指定XmlAdapter
应与字段或属性一起使用。
package forum13489697;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlRootElement
public class Person {
@XmlJavaTypeAdapter(ValueAdapter.class)
public String name;
}
选项#2 - EclipseLink JAXB(MOXy)
我是EclipseLink JAXB (MOXy)潜在客户,我们提供@XmlPath
扩展程序,可让您轻松进行基于路径的映射。
的人强> 的
package forum13489697;
import javax.xml.bind.annotation.XmlRootElement;
import org.eclipse.persistence.oxm.annotations.XmlPath;
@XmlRootElement
public class Person {
@XmlPath("name/@value")
public String name;
}
的 jaxb.properties 强> 的
要将MOXy指定为JAXB提供程序,您需要在与域模型相同的程序包中包含名为jaxb.properties
的文件,并带有以下条目(请参阅:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html)。
javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory
DEMO CODE
以下演示代码可与任一选项一起使用:
的演示强> 的
package forum13489697;
import java.io.File;
import javax.xml.bind.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Person.class);
Unmarshaller unmarshaller = jc.createUnmarshaller();
File xml = new File("src/forum13489697/input.xml");
Person person = (Person) unmarshaller.unmarshal(xml);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(person, System.out);
}
}
的 input.xml中/输出强> 的
<?xml version="1.0" encoding="UTF-8"?>
<person>
<name value="arahant" />
</person>
答案 1 :(得分:-1)
@XmlElement
public String name;