简体   繁体   English

如何为 XML 映射中的每个列表值指定不同的名称?

[英]How to give different name for each list value in XML mapping?

I have the following annotation using javax.xml.bind.annotation.XmlElement:我使用 javax.xml.bind.annotation.XmlElement 有以下注释:

@XmlElement        
public List<String> getKeywords() {
    return keywords;

}

Which produces the following XML:它产生以下 XML:

<keywords>keyword1</keywords>
<keywords>keyword2</keywords>

But I would like to get the below Output:但我想得到以下输出:

<A>keyword1</A>
<B>keyword2</B>

I mean some customized tag names for each list value.我的意思是每个列表值的一些自定义标签名称。

Here is an example of such mapping.这是此类映射的示例。 Main idea is to set @XmlAnyElement on a list getter and provide some mapping function between keywords and tag names.主要思想是在列表 getter 上设置 @XmlAnyElement 并提供一些关键字和标签名称之间的映射功能。 In this example it is achieved using a map, but implementation could be different depending on your logic.在此示例中,它是使用地图实现的,但根据您的逻辑,实现可能会有所不同。

Please note, that it could be difficult to deserialize resulting XML.请注意,反序列化生成的 XML 可能很困难。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.XmlAnyElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;

@XmlRootElement(name = "response")
public class Response {

    private List<String> keywords;

    static Map<String, String> names = new HashMap<>();

    static {
        names.put("keyword1", "A");
        names.put("keyword2", "B");
    }

    private String getElementName(String keyword) {
        return names.get(keyword);
    }

    @XmlAnyElement
    public List<JAXBElement<String>> getKeywords() {
        List<JAXBElement<String>> elements = new ArrayList<>();
        keywords.forEach(keyword -> {
            elements.add(new JAXBElement(
                    new QName(getElementName(keyword)), 
                    String.class, 
                    keyword)
            );
        });
        return elements;
    }

    public void setKeywords(List<String> keywords) {
        this.keywords = keywords;
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何给每个节点唯一的名称 - How to give each node unique name Jackson XML:如何从列表名称中获得不同的元素名称? - Jackson XML: How to have different element names from list name? 实现HashMap时如何为每个键提供不同的数组列表 <Integer, ArrayList<String> &gt; - How to give different array list for each key when implementing HashMap<Integer, ArrayList<String>> 使用JAXB注释,当每个列表元素具有未知名称时,如何获取包含在元素中的列表的每个XML元素? - Using JAXB annotations, how do you get each XML element of a list wrapped in an element, when each list element has an unknown name? 如何在VTD-XML中按节点名称-值合并(合并)两个不同的xml文件? - How to merge (join) two different xml files by node name-value in VTD-XML? 如何更改jaxb为列表中的每个项目输出的xml元素名称 - How can I change the xml element name that jaxb outputs for each item in a list 如何在此代码中为每个文本字段和标签命名? JAVA - How to give each textfield and label a name in this code? JAVA 如何在Scala中为列表提供默认值? - How to give a default value to a List in Scala? 如何在 log4j.xml 的 appender 中给出动态文件名 - How to give dynamic file name in the appender in log4j.xml 如何在 Java (Apache CXF) 中指定(给出实际名称)XML 字段 - How to Specify (give an actual name) XML fields in Java (Apache CXF)
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM