如何使用杰克逊反序列化不带标签的xml元素 [英] how to deserialize xml element without tag using jackson

查看:101
本文介绍了如何使用杰克逊反序列化不带标签的xml元素的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想在xml下面反序列化

I want deserialize below xml

<Test>
    <message num="90">[WANT TO EXTRACT THIS DATA]
        <care>test data 1</care>
        <care>test data 2</care>
    </message>
</Test>

具有如下结构

@JacksonXmlRootElement(localName = "Test")
public class Policy {

    @JacksonXmlProperty(localName = "message ")
    private final Message message;
//builders
}

在我下面的消息课中,

public class Message{

    @JacksonXmlProperty(localName = "care")
    private final List<String> care;

//builders
}

现在我要提取此[WANT TO EXTRACT THIS DATA]值,该值没有标签. 请帮我解决这个问题

Now I want to extract this [WANT TO EXTRACT THIS DATA] value, which has no tags. Please help me to resolve this

推荐答案

您可以像这样使用JAXB:

You can do it with JAXB like this:

@XmlRootElement(name = "Test")
class Policy {
    private Message message;

    public Message getMessage() {
        return this.message;
    }
    public void setMessage(Message message) {
        this.message = message;
    }

    @Override
    public String toString() {
        return "Policy [message=" + this.message + "]";
    }
}

public class Message {
    private int num;
    private List<Object> content;

    @XmlAttribute
    public int getNum() {
        return this.num;
    }
    public void setNum(int num) {
        this.num = num;
    }

    @XmlMixed
    @XmlElementRefs({
        @XmlElementRef(name="care", type=Care.class)})
    public List<Object> getContent() {
        return this.content;
    }
    public void setContent(List<Object> content) {
        this.content = content;
    }

    @XmlTransient
    public String getText() {
        if (this.content == null)
            return null;
        StringBuilder text = new StringBuilder();
        for (Object obj : this.content)
            if (obj instanceof String)
                text.append(obj);
        return text.toString().trim();
    }

    @XmlTransient
    public List<String> getCare() {
        if (this.content == null)
            return null;
        List<String> care = new ArrayList<>();
        for (Object obj : this.content)
            if (obj instanceof Care)
                care.add(((Care) obj).getValue());
        return care;
    }

    @Override
    public String toString() {
        return "Message[num=" + this.num + ", content=" + this.content + "]";
    }
}

@XmlRootElement(name = "care")
public class Care {
    private String value;

    @XmlValue
    public String getValue() {
        return this.value;
    }
    public void setValue(String value) {
        this.value = value;
    }

    @Override
    public String toString() {
        return "Care[value=" + this.value + "]";
    }
}

测试

String input = "<Test>\r\n" + 
               "    <message num=\"90\">[WANT TO EXTRACT THIS DATA]\r\n" + 
               "        <care>test data 1</care>\r\n" + 
               "        <care>test data 2</care>\r\n" + 
               "    </message>\r\n" + 
               "</Test>";
JAXBContext jaxbContext = JAXBContext.newInstance(Policy.class, Care.class);
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
Policy policy = (Policy) unmarshaller.unmarshal(new StringReader(input));
System.out.println(policy);
System.out.println("text = \"" + policy.getMessage().getText().replace("\n", "\\n") + "\"");
System.out.println("care = " + policy.getMessage().getCare());

输出

Policy [message=Message[num=90, content=[[WANT TO EXTRACT THIS DATA]
        , Care[value=test data 1], 
        , Care[value=test data 2], 
    ]]]
text = "[WANT TO EXTRACT THIS DATA]"
care = [test data 1, test data 2]

这篇关于如何使用杰克逊反序列化不带标签的xml元素的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆