java - 使用 JaxB 编码时如何避免添加特定元素/值

标签 java xml jaxb

我有一个 XML 数据,如下所示。我需要能够编码/解码这个。目标很简单,我在那里没有遇到任何问题

XML 的代码片段

<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>
<messages>
	<message msg-id=\"1\" msg-type=\"ERROR\" msg=\"\"/>
        <message msg-id=\"2\" msg-type=\"INFO\" msg=\"\"/>
        <message msg-id=\"3\" msg-type=\"WARNING\" msg=\"\"/>
</messages>

在我的主 POJO 类 Messages 中,我有一个 HashMap ,用于将消息映射到 ID。我希望消息映射不进入 XML。 简而言之,我想知道它们是否是任何特定的注释或方式,我可以使用它们来避免特定数据(在本例中为 HashMap)在我进行编码时不转到生成的 XML

编码时生成的 XML 片段

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<messages>
    <message msg-id="1" msg-type="ERROR" msg=" madrid"></message>
    <message msg-id="2" msg-type="INFO" msg="portugal"></message>
    <message msg-id="3" msg-type="WARNING" msg="barcelona"></message>
    <messageMap>
        <entry>
            <key>3</key>
            <value msg-id="3" msg-type="WARNING" msg="barcelona"></value>
        </entry>
        <entry>
            <key>2</key>
            <value msg-id="2" msg-type="INFO" msg="portugal"></value>
        </entry>
        <entry>
            <key>1</key>
            <value msg-id="1" msg-type="ERROR" msg=" madrid"></value>
        </entry>
    </messageMap>
</messages>

在我的主 POJO 类 Messages 中,我有一个 HashMap ,用于将消息映射到 ID。 我希望消息映射不进入 XML。

==============用于消息输入的POJO===================

package code.rfid.common.salami;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "message")
public class Message {

    @XmlValue
    protected String value;
    @XmlAttribute(name = "msg-id")
    protected String msgId;
    @XmlAttribute(name = "msg-type")
    protected String msgType;
    @XmlAttribute(name = "msg")
    protected String msg;

    public static String INFO = "info";
    public static String ERROR = "error";
    public static String WARNING = "warning";

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }

    public String getMsgId() {
        return msgId;
    }

    public void setMsgId(String value) {
        this.msgId = value;
    }

    @Override
    public String toString() {
        return "Message [value=" + value + ", msgId=" + msgId + ", msgType="
                + msgType + ", msg=" + msg + "]";
    }

    public String getMsgType() {
        return msgType;
    }

    public void setMsgType(String value) {
        this.msgType = value;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String value) {
        this.msg = value;
    }
}

========用于消息的 POJO====================

package code.rfid.common.salami;

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

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "messages")
public class Messages {

    @Override
    public String toString() {
        return "Messages [message=" + message + ", messageMap=" + messageMap
                + "]";
    }

    protected List<Message> message;
    protected HashMap<String, Message> messageMap;

    public List<Message> getMessage() {
        if (message == null) {
            message = new ArrayList<Message>();
        }
        return this.message;
    }

    public HashMap<String, Message> getMessageMap() {
        if (messageMap == null) {
            messageMap = new HashMap<String, Message>();
        }
        return messageMap;
    }

    public void populateMessageMap()
    {
        messageMap = new HashMap<String, Message>();
        if(message == null || message.isEmpty())
            return;
        for(Message _message: message)
        {
            messageMap.put(_message.getMsgId(), _message);
        }
    }
}

========================== 编码和解码代码

package code.rfid.common;

import java.io.StringReader;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;

import code.rfid.common.salami.Messages;

public class MessageJaxBPort {

    static String responseString ="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>"
                            + "<messages>"
                            + "<message msg-id=\"1\" msg-type=\"ERROR\" msg=\" madrid\"/>"
                            + "<message msg-id=\"2\" msg-type=\"INFO\" msg=\"portugal\"/>"
                            + "<message msg-id=\"3\" msg-type=\"WARNING\" msg=\"barcelona\"/>"
                        + "</messages>";

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        try {
            JAXBContext jaxbContext = JAXBContext.newInstance(Messages.class);
            Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();

            Messages mapmessages = (Messages) jaxbUnmarshaller.unmarshal(new StringReader( responseString));
            System.out.println("UserInfo object :- " + mapmessages.toString());

            Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
            jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
            jaxbMarshaller.marshal(mapmessages, System.out);
        } catch (JAXBException jaxbEx) {
            jaxbEx.printStackTrace();
        }
    }
}

最佳答案

添加@XmlTransient您的消息映射属性的注释如下:

@XmlTransient
public HashMap<String, Message> getMessageMap() {

这将导致编码(marshal)拆收器排除此属性。

关于java - 使用 JaxB 编码时如何避免添加特定元素/值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28200152/

相关文章:

xml - 如何从 Perl 创建 XML?

C# 序列化包含更多列表的对象列表

java - 无法使用 RestTemplate 解析 REST 响应

jaxb - 使用 annox 编辑 JAXB 生成的注释并在参数中添加命名空间

java - GridLayout 不适用于 BoxInsetLayout

java - 我希望 RecyclerView 在滚动到结束时加载更多项目。我怎样才能得到这个?

java - 在 netbeans 6.8 中,你如何插入图像并改变它的大小?

java - struts 中的无效 token

javascript - 使用 Javascript 创建 XML 文件

java - JAXB和Hibernate3非法访问的问题