Как использовать свойства hashmap с JAXB? - PullRequest
7 голосов
/ 15 марта 2011

Я некоторое время возился с 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. Спасибо!

1 Ответ

8 голосов
/ 16 марта 2011

@ XmlAnyAttribute соответствует тому, что вам нужно:

Root

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

}

CNode

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

}

Input.xml

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