JAXB能否以逗号分隔值输出ArrayList?

时间:2010-10-14 19:29:30

标签: java xml jaxb marshalling

我有类似

的东西
@XmlElementWrapper(name="Mylist")
List<Items> myItems = new ArrayList<Items>()

就像

一样
<Mylist>
   <myItems>item 1</myItems>
   <myItems>item 2</myItems>
   <myItems>item 3</myItems>
</Mylist>

是否有可能使这更像是

<Mylist>
   <myItems>item 1, item 2, item 3</myItems>
</Mylist>

因为我所追求的数据无论如何都只是文本?

3 个答案:

答案 0 :(得分:5)

您可以使用@XmlList将其设为空格分隔值。

对于以逗号分隔的列表,您需要使用XmlAdapter。有关XmlAdapter的更多信息,请参阅:

答案 1 :(得分:2)

这里有XmlAdapter来处理以逗号分隔的列表:

import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.adapters.XmlAdapter;

public class CommaSeparatedListAdapter extends XmlAdapter<String, List<String>> {

    @Override
    public List<String> unmarshal(final String string) {
        final List<String> strings = new ArrayList<String>();

        for (final String s : string.split(",")) {
            final String trimmed = s.trim();

            if (trimmed.length() > 0) {
                strings.add(trimmed);
            }
        }

        return strings;
    }

    @Override
    public String marshal(final List<String> strings) {
        final StringBuilder sb = new StringBuilder();

        for (final String string : strings) {
            if (sb.length() > 0) {
                sb.append(", ");
            }

            sb.append(string);
        }

        return sb.toString();
    }
}

您可以这样使用它:

@XmlElementWrapper(name="Mylist")
@XmlJavaTypeAdapter(CommaSeparatedListAdapter.class)
List<Items> myItems = new ArrayList<Items>()

答案 2 :(得分:0)

您可以通过使字段为瞬态@XmlTransient并创建一种用于计算字符串(以逗号分隔)的方法来实现这一目标。

@XmlTransient
List<Items> myItems = new ArrayList<Items>()

@XmlElement(name = "myItems")
public String getItemsAsCommasSeparated() {
    return String.join(", ", myItems);
}

关于包装<Mylist>,如果确实有必要,则必须将列表包装到另一个对象中。