首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JAXB @XmlMixed和@XmlAdapter

JAXB @XmlMixed和@XmlAdapter
EN

Stack Overflow用户
提问于 2014-04-03 16:29:31
回答 1查看 725关注 0票数 0

我正在尝试创建一个@XmlAdapter,将混合列表中的单词拆分为名为Word的包装类的对象。此字段还可能包含名为Group的Word扩展的实例。

这样做的目的是:

代码语言:javascript
复制
<span>Some text and a <g>group of words</g> and more<span>

相当于:

代码语言:javascript
复制
span.getContent().add(new Word("Some");
span.getContent().add(new Word("text");
span.getContent().add(new Word("and");
span.getContent().add(new Word("a");
span.getContent().add(new Group("group of words");
span.getContent().add(new Word("and");
span.getContent().add(new Word("more");

我正在与所有可能的组合,牛,XmlMixed和XmlAdapter,我可以想到,但没有运气!

这是我的latet适配器,它根本无法工作:

代码语言:javascript
复制
public class SpanAdapter extends XmlAdapter<List<Word>, List> {

@Override
public List<Word> marshal(List v) throws Exception {
    List<Word> list = new ArrayList<>();
    for (Object o : v) {
        if (o instanceof String) {
            String s = (String) o;
            StringTokenizer st = new StringTokenizer(s, " ");
            while (st.hasMoreElements()) {
                Word word = new Word();
                word.setValue(st.nextToken());
                list.add(word);
            }
        } else if (o instanceof Group) {
            list.add((Group) o);
        }
    }
    return list;
}

@Override
public List unmarshal(List<Word> v) throws Exception {
    List list = new ArrayList<>();
    for (Word w : v) {
        if(w instanceof Group){
            list.add(w);
        } else{
            list.add(w.getValue()+ " ");
        }
    }
    return v;
}

}

我的斯潘班:

代码语言:javascript
复制
@XmlRootElement(name = "span")
public class Span extends AudioComponent implements Item.Component {

private List<Word> value = new ArrayList();

@XmlMixed
@XmlElementRefs({
        @XmlElementRef(type = Group.class),
        @XmlElementRef(type = Word.class)
})
@XmlJavaTypeAdapter(SpanAdapter.class)
public List<Word> getValue() {
    return value;
}

public void setValue(List<Word> value) {
    this.value = value;
}

}

单词和组只是字符串的包装器。群扩展词。

我正在使用MOXY以防有帮助。

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-04-08 09:50:16

万一它对任何人都有帮助:

通过在包含Span元素的List字段中设置Adapter,我成功地做到了这一点。

在包级别或Span类级别设置适配器将无法工作。

另外,适配器不是从List转换到List,而是从Span转换到Span,并在内部修改列表。

最后的配置是:

我定义适配器的位置:

代码语言:javascript
复制
@XmlElementRefs({
        @XmlElementRef(type = Span.class),
        @XmlElementRef(type = Other.class),
        @XmlElementRef(type = Another.class)

})
@XmlJavaTypeAdapter(value = SpanAdapter.class)
public List<Component> getComponents() {
    if (components == null) components = new ArrayList();
    return components;
}

适配器(因为我在可能包含其他类的列表字段中使用它,所以不能从一个span执行到另一个步骤):

代码语言:javascript
复制
public class SpanAdapter extends XmlAdapter<Object, Object> {

@Override
public Object unmarshal(Object o) throws Exception {
    if (o instanceof Span) {
        Span span = (Span) o;
        List<Span.Component> list = new ArrayList<>();
        for (Object child : span.getValue()) {
            if (child instanceof String) {
                String s = (String) child;
                for (String w : s.split(" ")) {
                    Word word = new Word();
                    word.setValue(w.trim());
                    list.add(word);
                }
            } else if (child instanceof Group) {
                list.add((Group) child);
            }
        }
        span.setValue(list);
        return span;
    }
    return o;
}

@Override
public Object marshal(Object o) throws Exception {
    if(o instanceof Span) {
        Span span = (Span) o;
        List list = new ArrayList<>();
        Iterator<Span.Component> iterator = span.getValue().iterator();
        while (iterator.hasNext()) {
            Span.Component w = iterator.next();
            if (w instanceof Group) {
                list.add(w);
            } else if (w instanceof Word) {
                String value = ((Word) w).getValue();
                list.add(iterator.hasNext() ? value + " " : value);
            }
        }
        span.setValue(list);
        return span;
    }else return o;
}
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22843639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档