使用JaXB的类字段的属性

使用JaXB的类字段的属性,jaxb,attributes,Jaxb,Attributes,我试图简化POJO到XML的转换,但是我面临着类字段属性的问题 考虑以下XML文件 <cat> <displayTexts> <displayText language="en">12</displayText> <displayText language="en">23</displayText> </displayTexts>

我试图简化POJO到XML的转换,但是我面临着类字段属性的问题

考虑以下XML文件

 <cat>
        <displayTexts>
            <displayText language="en">12</displayText>
            <displayText language="en">23</displayText>
        </displayTexts>
    </cat>   

12
23

我有一节课

@XmlRootElement(name = "cat")
public class Category{
    List<Integer> list;

    public List<Integer> getList() {
        return list;
    }

    @XmlElementWrapper(name = "displayTexts")
    @XmlElement(name = "displayText")
    public void setList(List<Integer> list) {
        this.list = list;
    }


}
@XmlRootElement(name=“cat”)
公共类类别{
名单;
公共列表getList(){
退货清单;
}
@XmlElementWrapper(name=“displayTexts”)
@xmlement(name=“displayText”)
公共无效集合列表(列表){
this.list=列表;
}
}
如何编写一个适配器来生成上面提到的XML

现在,它将生成类似以下xml的内容:

<cat>
        <displayTexts>
            <displayText>12</displayText>
            <displayText>23</displayText>
        </displayTexts>
    </cat>

12
23

注意::我不允许使用MoXy。我知道我可以通过编写一个不同的类来实现这一点。问题是我们能不能编写一个适配器,这样我就可以对任何类字段概括这个属性?

虽然我仍然建议使用一个类而不是整数来使用displayText及其属性的值,但是如果您想在没有任何新类的情况下实现,您可以在displayList中使用@XmlAnyElement并自己“创建”xml,进行以下操作:

import java.util.Arrays;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

@XmlRootElement(name = "cat")
public class Category {

    List<Integer> list;

    @XmlAnyElement()
    @XmlJavaTypeAdapter(MyIntegerAdapter.class)
    public List<Integer> getList() {
        return list;
    }
    //@XmlElement(name = "displayText")

    public void setList(List<Integer> list) {
        this.list = list;
    }

    public static void main(String[] args) throws Exception {
        Category bx = new Category();

        List<Integer> lists = Arrays.asList(121, 212);
        bx.setList(lists);

        JAXBContext jc = JAXBContext.newInstance(Category.class);
        MyIntegerAdapter adapter = new MyIntegerAdapter();
        Marshaller marrshaller = jc.createMarshaller();
        marrshaller.setAdapter(adapter);
        marrshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        marrshaller.marshal(bx, System.out);
    }
}

class MyIntegerAdapter extends XmlAdapter<Element, List<Integer>> {

    private DocumentBuilder documentBuilder;

    public MyIntegerAdapter() {
    }

    private DocumentBuilder getDocumentBuilder() throws Exception {
        // Lazy load the DocumentBuilder as it is not used for unmarshalling.
        if (null == documentBuilder) {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            documentBuilder = dbf.newDocumentBuilder();
        }
        return documentBuilder;
    }

    @Override
    public Element marshal(List<Integer> lists) throws Exception {
        if (null == lists) {
            return null;
        }
        Document document = getDocumentBuilder().newDocument();
        Element element = document.createElement("displayTexts");
        for (int value : lists) {
            Element displayText = document.createElement("displayText");
            System.out.println("value.." + value);
            displayText.setTextContent(value + "");
            displayText.setAttribute("Lang", "en");
            element.appendChild(displayText);
        }
        return element;
    }

    @Override
    public List<Integer> unmarshal(Element v) throws Exception {
        //TODO
        throw new UnsupportedOperationException(); 

    }
}
导入java.util.array;
导入java.util.List;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.Marshaller;
导入javax.xml.bind.annotation.xmlanyement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.adapters.XmlAdapter;
导入javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
@XmlRootElement(name=“cat”)
公共类类别{
名单;
@xmlanyement()
@XmlJavaTypeAdapter(MyIntegerAdapter.class)
公共列表getList(){
退货清单;
}
//@xmlement(name=“displayText”)
公共无效集合列表(列表){
this.list=列表;
}
公共静态void main(字符串[]args)引发异常{
类别bx=新类别();
List=Arrays.asList(121212);
设置列表(列表);
JAXBContext jc=JAXBContext.newInstance(Category.class);
MyIntegerAdapter=新的MyIntegerAdapter();
Marshaller=jc.createMarshaller();
marrshaller.设置适配器(适配器);
setProperty(Marshaller.JAXB_格式化的_输出,Boolean.TRUE);
marrshaller.Marshaller.Marshaller.Marshaller(bx,系统输出);
}
}
类MyIntegerAdapter扩展了XmlAdapter{
私人文档生成器文档生成器;
公共MyIntegerAdapter(){
}
私有DocumentBuilder getDocumentBuilder()引发异常{
//延迟加载DocumentBuilder,因为它不用于解组。
if(null==documentBuilder){
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
documentBuilder=dbf.newDocumentBuilder();
}
返回文档生成器;
}
@凌驾
公共元素封送处理(列表)引发异常{
if(null==列表){
返回null;
}
Document Document=getDocumentBuilder().newDocument();
元素=document.createElement(“显示文本”);
for(int值:列表){
Element displayText=document.createElement(“displayText”);
System.out.println(“值..”+值);
displayText.setTextContent(值+“”);
setAttribute(“Lang”、“en”);
元素。追加子元素(显示文本);
}
返回元素;
}
@凌驾
公共列表解组器(元素v)引发异常{
//待办事项
抛出新的UnsupportedOperationException();
}
}

尽管我仍然建议使用类而不是整数来使用displayText及其属性的值,但如果您希望在不使用任何新类的情况下实现,您可以使用@XmlAnyElement为您的displayList创建以下快照,并亲自“创建”xml:

import java.util.Arrays;
import java.util.List;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.adapters.XmlAdapter;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

@XmlRootElement(name = "cat")
public class Category {

    List<Integer> list;

    @XmlAnyElement()
    @XmlJavaTypeAdapter(MyIntegerAdapter.class)
    public List<Integer> getList() {
        return list;
    }
    //@XmlElement(name = "displayText")

    public void setList(List<Integer> list) {
        this.list = list;
    }

    public static void main(String[] args) throws Exception {
        Category bx = new Category();

        List<Integer> lists = Arrays.asList(121, 212);
        bx.setList(lists);

        JAXBContext jc = JAXBContext.newInstance(Category.class);
        MyIntegerAdapter adapter = new MyIntegerAdapter();
        Marshaller marrshaller = jc.createMarshaller();
        marrshaller.setAdapter(adapter);
        marrshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);

        marrshaller.marshal(bx, System.out);
    }
}

class MyIntegerAdapter extends XmlAdapter<Element, List<Integer>> {

    private DocumentBuilder documentBuilder;

    public MyIntegerAdapter() {
    }

    private DocumentBuilder getDocumentBuilder() throws Exception {
        // Lazy load the DocumentBuilder as it is not used for unmarshalling.
        if (null == documentBuilder) {
            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
            documentBuilder = dbf.newDocumentBuilder();
        }
        return documentBuilder;
    }

    @Override
    public Element marshal(List<Integer> lists) throws Exception {
        if (null == lists) {
            return null;
        }
        Document document = getDocumentBuilder().newDocument();
        Element element = document.createElement("displayTexts");
        for (int value : lists) {
            Element displayText = document.createElement("displayText");
            System.out.println("value.." + value);
            displayText.setTextContent(value + "");
            displayText.setAttribute("Lang", "en");
            element.appendChild(displayText);
        }
        return element;
    }

    @Override
    public List<Integer> unmarshal(Element v) throws Exception {
        //TODO
        throw new UnsupportedOperationException(); 

    }
}
导入java.util.array;
导入java.util.List;
导入javax.xml.bind.JAXBContext;
导入javax.xml.bind.Marshaller;
导入javax.xml.bind.annotation.xmlanyement;
导入javax.xml.bind.annotation.XmlRootElement;
导入javax.xml.bind.annotation.adapters.XmlAdapter;
导入javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
导入javax.xml.parsers.DocumentBuilder;
导入javax.xml.parsers.DocumentBuilderFactory;
导入org.w3c.dom.Document;
导入org.w3c.dom.Element;
@XmlRootElement(name=“cat”)
公共类类别{
名单;
@xmlanyement()
@XmlJavaTypeAdapter(MyIntegerAdapter.class)
公共列表getList(){
退货清单;
}
//@xmlement(name=“displayText”)
公共无效集合列表(列表){
this.list=列表;
}
公共静态void main(字符串[]args)引发异常{
类别bx=新类别();
List=Arrays.asList(121212);
设置列表(列表);
JAXBContext jc=JAXBContext.newInstance(Category.class);
MyIntegerAdapter=新的MyIntegerAdapter();
Marshaller=jc.createMarshaller();
marrshaller.设置适配器(适配器);
setProperty(Marshaller.JAXB_格式化的_输出,Boolean.TRUE);
marrshaller.Marshaller.Marshaller.Marshaller(bx,系统输出);
}
}
类MyIntegerAdapter扩展了XmlAdapter{
私人文档生成器文档生成器;
公共MyIntegerAdapter(){
}
私有DocumentBuilder getDocumentBuilder()引发异常{
//延迟加载DocumentBuilder,因为它不用于解组。
if(null==documentBuilder){
DocumentBuilderFactory dbf=DocumentBuilderFactory.newInstance();
documentBuilder=dbf.newDocumentBuilder();
}
返回文档生成器;
}
@凌驾