1

我正在使用 JAXB 将一些 xml 解组到一个对象中。

我有一个从抽象类继承的类。我已将抽象类标记为@XmlTransient。然后使用 XMLType PropOrder 我可以访问抽象类中的属性,如下所示:

@XmlType( propOrder = { "id"...

凉爽的。问题有时不是我想要访问的元素,而是属性。通常,您会使用@XMLAttribute 定义这样的属性,以指示该值存储在xml 属性中而不是元素中。但是考虑到我已经在定义了“id”的抽象类上使用了 XMLTransient,当我尝试将该字段标记为 @XMLAttribute 时,JAXB 会抱怨。

JAXB 抱怨我试图访问/返回两个同名字段。

谁能指出我正确的方向?我正在为 GAE 构建,所以我真的不想使用任何其他库。

提前致谢!

4

1 回答 1

2

以下是您可以做的几件事:

Java 模型

您可以使用 注释父类上的属性@XmlAttribute

import javax.xml.bind.annotation.*;

@XmlTransient
public class Foo {

    private String att1;
    private String att2;

    @XmlAttribute
    public String getAtt1() {
        return att1;
    }

    public void setAtt1(String att1) {
        this.att1 = att1;
    }

    public String getAtt2() {
        return att2;
    }

    public void setAtt2(String att2) {
        this.att2 = att2;
    }

}

酒吧

您可以覆盖子类上的属性并使用@XmlAttribute.

import javax.xml.bind.annotation.*;

@XmlRootElement
public class Bar extends Foo {

    @Override
    @XmlAttribute
    public String getAtt2() {
        return super.getAtt2();
    }

    @Override
    public void setAtt2(String att2) {
        super.setAtt2(att2);
    }

}

演示代码

演示

下面是一些演示代码,您可以运行它来证明一切正常。

import javax.xml.bind.*;

public class Demo {

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

        Bar bar = new Bar();
        bar.setAtt1("a");
        bar.setAtt2("b");

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

}

输出

下面是运行演示代码的输出:

<?xml version="1.0" encoding="UTF-8"?>
<bar att1="a" att2="b"/>
于 2013-08-29T14:04:16.723 回答