java - 如何在 JAXB 中使用 hashmap 属性?

标签 java jaxb hashmap

我已经摆弄 JAXB 一段时间了,我需要生成如下所示的 xml

<Root attr1="" attr2="" .. attrn="" >
  <CNode attr1="" attr2="" />
   .
   .
   .
   <CNode .. />
</Root>

根元素的属性是动态的,可能来自属性文件或模板。将它放入如上所示的结构中的最佳方法是什么?我正在为动态变量使用散列图,然后尝试使用 XmlJavaTypeAdapter 对其进行映射,我能做的最好的就是

<Root>
  <Attribs>
      <entry key="attr1">Value</entry>
  </Attribs>
  <CNode .. />
</Root>

jaxb 中是否有一种方法可以说使用 hashmap 的键作为属性名称,并将该键的值用作 xml 中该属性的值?或者,如果您认为有更好的方法,我愿意提供建议。我正在考虑使用 jaxb 的编码器单独添加 Root 节点。但是,如果我可以只使用 jaxb 的适配器,那就更好了。谢谢!

最佳答案

@XmlAnyAttribute 符合您的需要:

import java.util.List;
import java.util.Map;

import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;

@XmlRootElement(name="Root")
public class Root {

    private Map<QName, String> extension;
    private List<CNode> cnodes;

    @XmlAnyAttribute
    public Map<QName, String> getExtension() {
        return extension;
    }

    public void setExtension(Map<QName, String> extension) {
        this.extension = extension;
    }

    @XmlElement(name="CNode")
    public List<CNode> getCnodes() {
        return cnodes;
    }

    public void setCnodes(List<CNode> cnodes) {
        this.cnodes = cnodes;
    }

}

C节点

import java.util.Map;
import javax.xml.bind.annotation.XmlAnyAttribute;
import javax.xml.namespace.QName;

public class CNode {

    private Map<QName, String> extension;

    @XmlAnyAttribute
    public Map<QName, String> getExtension() {
        return extension;
    }

    public void setExtension(Map<QName, String> extension) {
        this.extension = extension;
    }

}

演示

import java.io.File;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

public class Demo {

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

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Root root = (Root) unmarshaller.unmarshal(new File("input.xml"));

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

}

输入.xml

<?xml version="1.0" encoding="UTF-8"?>
<Root att1="A" att2="B">
    <CNode att3="C" att4="D"/>
    <CNode att5="E" att6="F"/>
</Root>

关于java - 如何在 JAXB 中使用 hashmap 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5317172/

相关文章:

java - 一个数组列表可以容纳多少个字符串?

java - Java 中的 Leap Motion 错过了点击手势

java - JAXB 生成的方法不使用泛型

java:自动更新 HashMap

java - 垃圾收集和 Apache Commons 元组对

javascript - Java:使用 JavaScript 上传图像 - 文件损坏、损坏或太大

java - 导出 Jar 应用程序无法与 MySql 连接

binding - JAXB XJC 两个声明导致冲突。无法兑现自定义绑定(bind)

java - JAXB 中的解码是如何工作的?

Java HashMap 仅打印一次单独的值