3
public class Person {
    public String name; ...
}

当我编组时,我想获得一个具有 value 属性的 Name 节点

<name value="arahant" />

代替 :

<name>arahant</name>

我怎样才能做到这一点?我尝试查看 XmlElementWrapper 但仅允许用于集合。我需要为此编写自定义代码吗?

4

1 回答 1

4

您可以使用几个选项来支持此用例。


选项 #1 -XmlAdapter任何 JAXB (JSR-222) 实现

此方法适用于任何符合JAXB (JSR-222) 的实现。

值适配器

AnXmlAdapter允许您编组一个对象,就好像它是另一个对象一样。在我们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

演示代码

以下演示代码可与任一选项一起使用:

演示

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

}

输入.xml/输出

<?xml version="1.0" encoding="UTF-8"?>
<person>
    <name value="arahant" />
</person>
于 2012-11-21T10:22:54.313 回答