如何(取消)在子类中封送根元素的值

时间:2019-04-17 12:23:19

标签: java xml jaxb

我正在使用JAXB分解从XML到Java的复杂对象。 XML中有问题的部分看起来像:

<product>
    <!-- SNIP -->
    <keywords>
        <keyword optionalAttribute="attrValue">Value</keyword>
        <keyword>Another value</keyword>
    </keywords>
</product>

我有一个Java类,用于父对象和带有javax.xml.bind.annotation.*批注的复杂属性(包括关键字)。

@XmlRootElement(name = "product")
@XmlAccessorType(XmlAccessType.NONE)
public class Product extends Model {

    // SNIP

    @XmlElementWrapper(name = "keywords")
    @XmlElement(name = "keyword")
    public List<ProductKeyword> keywords;
}
@XmlRootElement(name = "keyword")
@XmlAccessorType(XmlAccessType.NONE)
public class ProductKeyword extends Model {

    @XmlAttribute(name = "optionalAttribute")
    public String optionalAttribute;

    @XmlMixed
    public String keyword;

}

ProductKeyword.keyword字段需要保留<keyword>元素的值,该元素是子类的根元素。 @XmlMixed似乎没有诱使JAXB尝试将任何内容解组到该字段中。

我相信我需要@XmlValue,但是不能在子类上使用该注释(除非超类用@XmlTransient注释。)

有人可以提出解决方法吗?

约束:

  • 我无法更改XML的格式。

  • 我无法摆脱Model超类(需要持久性)

  • 我无法(通过外部库)修改超类

无约束:

  • 如果需要,我可以向父或子Java类添加额外的字段。

  • 如果我可以通过任何形式或任何方式将关键字的值输入到类中,那么我可以进行所需的任何后处理,以正确的位置/格式获取它。

    < / li>
  • 不一定要漂亮。

1 个答案:

答案 0 :(得分:1)

我尝试输入代码,您可以重试! 在您的Maven中添加了此依赖关系或下载了jar。

 <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>org.eclipse.persistence.moxy</artifactId>
            <version>2.5.0-RC1</version>
            <exclusions>
                <exclusion>
                    <groupId>org.eclipse.persistence</groupId>
                    <artifactId>commonj.sdo</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

然后,您无需更改任何pojo!只需更改解组方式即可! 我将xml存储在文件中,您可以使用inputstream或任何方式。

public static void main(String[] args) throws JAXBException, IOException {
        JAXBContext context = JAXBContextFactory.createContext(new Class[]{Product.class}, new HashMap());
        Unmarshaller unmarshaller = context.createUnmarshaller();
        InputStream is = new ClassPathResource("stand.xml").getInputStream();
        Product product= (Product) unmarshaller.unmarshal(is);
        System.out.println(product);
    }

Success