1

我有以下课程

@XmlRootElement
public class Test {

    @XmlTransient
    private String abc;

    @XmlElement
    private String def;

}

我的问题是,我想用这个类来生成两种 XML

1. With <abc>
2. without <abc>

我可以实现第二个,因为我已将其标记为瞬态。有什么办法可以让我将“abc”标记为@XMLElement并且可以在编组时忽略它?

提前致谢

4

1 回答 1

2

注意: 我是EclipseLink JAXB (MOXy)负责人,也是JAXB (JSR-222)专家组的成员。

您可能对@XmlNamedObjectGraph我们在 EclipseLink 2.5.0 中添加的扩展感兴趣。它允许您在域模型上定义多个视图。您今天可以使用每晚构建来尝试一下:

下面我举个例子:

测试

@XmlNamedObjectGraph注释用于定义可在编组和解组时使用的对象图的子集。

import javax.xml.bind.annotation.*;
import org.eclipse.persistence.oxm.annotations.*;

@XmlNamedObjectGraph(
    name="only def",
    attributeNodes = {
        @XmlNamedAttributeNode("def")
    }
)
@XmlRootElement
public class Test {

    private String abc;
    private String def;

    public String getAbc() {
        return abc;
    }

    public void setAbc(String abc) {
        this.abc = abc;
    }

    public String getDef() {
        return def;
    }

    public void setDef(String def) {
        this.def = def;
    }

}

演示

MarshallerProperties.OBJECT_GRAPH用于指定应编组的对象图。

import javax.xml.bind.*;
import org.eclipse.persistence.jaxb.MarshallerProperties;

public class Demo {

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

        Test test = new Test();
        test.setAbc("FOO");
        test.setDef("BAR");

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);

        // Marshal the Entire Object
        marshaller.marshal(test, System.out);

        // Marshal Only What is Specified in the Object Graph
        marshaller.setProperty(MarshallerProperties.OBJECT_GRAPH, "only def");
        marshaller.marshal(test, System.out);
    }

}

输出

下面是运行演示代码的输出。第一次Test编组的实例包含所有属性,第二次仅包含def属性。

<?xml version="1.0" encoding="UTF-8"?>
<test>
   <abc>FOO</abc>
   <def>BAR</def>
</test>
<?xml version="1.0" encoding="UTF-8"?>
<test>
   <def>BAR</def>
</test>

了解更多信息

于 2013-03-01T02:20:06.630 回答