【问题标题】:Java unmarshalling complex xml into ObjectJava将复杂的xml解组为Object
【发布时间】:2017-05-23 16:31:23
【问题描述】:
 I tried to unmarshall following xml file.

<ns2:Triggermessage xmlns="http://www.asd.com/messaging" xmlns:ns2="http://www.asd.com/messaging/closing/trigger">
  <Header>
    <creationTimeStamp>2017-05-23T12:11:46.950+00:00</creationTimeStamp>
    <businessDate>2017-05-23</businessDate>
    <messageId>20170523-22:30:00_Calypso Rpt 7_444_0</messageId>
    <conversationId>7397dbd3-5177-40ff-acb5-1b2ba8d0d1f6</conversationId>
    <numberOfRecords>1</numberOfRecords>
    <sentBy>ABCDE</sentBy>
    <sendto>Camplico</sendto>
    <processingCycle>ACD</processingCycle>
  </Header>
  <ns2:Request>
    <ns2:ProcessingCircle>EOD</ns2:ProcessingCircle>
  </ns2:Request>
</ns2:Triggermessage>

Here I created classes in this way.(not all the classes are mentioned here)

**TriggerMessage.java**
 @XmlRootElement(name = "TriggerMessage", namespace="http://www.asd.com/messaging/closing/trigger")
    public class TriggerMessage {

        private Header header;
        private Request request;

        @XmlElement(name = "Header")
        public Header getHeader() {
            return header;
        }
        public void setHeader(Header header) {
            this.header = header;
        }

        @XmlElement(name = "Request")
        public Request getRequest() {
            return request;
        }
        public void setRequest(Request request) {
            this.request = request;
        }
    }

**Header.java**
private CreationTimeStamp creationTimeStamp;
    private BusinessDate businessDate;
    private MessageId messageId;
    private ConversationId conversationId;
    private SentBy sentBy;
    private SendTo sendTo;
    private ProcessingCycle processingCycle;
    private NumberOfRecords numberOfRecords;
@XmlElement(name = "creationTimeStamp")
public CreationTimeStamp getCreationTimeStamp() {
    return creationTimeStamp;
}
public void setCreationTimeStamp(CreationTimeStamp creationTimeStamp) {
    this.creationTimeStamp = creationTimeStamp;
}

@XmlElement(name = "businessDate")
public BusinessDate getBusinessDate() {
    return businessDate;
}
public void setBusinessDate(BusinessDate businessDate) {
    this.businessDate = businessDate;
}

@XmlElement(name = "conversationId")
public ConversationId getConversationId() {
    return conversationId;
}
public void setConversationId(ConversationId conversationId) {
    this.conversationId = conversationId;
}

@XmlElement(name = "messageId")
public MessageId getMessageId() {
    return messageId;
}
public void setMessageId(MessageId messageId) {
    this.messageId = messageId;


 }
-
-
-}

**CreationTimeStamp.java**

 public class CreationTimeStamp {

        private String value;

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

  **Request.java**

@XmlType(namespace="http://www.asd.com/messaging/closing/trigger")
public class Request {

    private ProcessingCircle processingCircle;

    @XmlElement(name = "processingCircle")
    public ProcessingCircle getProcessingCircle() {
        return processingCircle;
    }
    public void setProcessingCircle(ProcessingCircle processingCircle) {
        this.processingCircle = processingCircle;
    }
}

得到对象如下enter image description here

谁能提到我需要如何正确创建 java 类才能正确解组所有值。请注意我在这里没有使用 package-info.java 文件。

这是我用来解组的代码

private List<Object> unMarshalMessages(List<String> messages) {
        List<Object> messageObjects = new ArrayList<Object>();
        JAXBContext context = null;
        try {
            context = JAXBContext.newInstance(Class.forName("com.msgs.calpico.TriggerMessage"));
            Unmarshaller m = context.createUnmarshaller();
            StringReader reader = null;
            for (String message : messages) {
                reader = new StringReader(message);
            messageObjects.add(((com.msgs.calpico.TriggerMessage) m.unmarshal(reader)));
            }

        } catch (JAXBException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        LOGGER.info("After unmarshal the output messages size: " + messageObjects.size());
        return messageObjects;
    }

【问题讨论】:

    标签: java xsd annotations xml-namespaces unmarshalling


    【解决方案1】:

    将xml转换成xsd。 之后使用 eclipse,创建 jaxb 项目并指向 xsd。会根据xsd文件生成java文件。

    生成 java 模式文件后,您可以使用 marshall 和 unmarsahll 代码。

    私有静态 JAXBContext _jaxbContext;

    static
    {
        ClassLoader cl = Thread.currentThread().getContextClassLoader();
        try
        {
            Thread.currentThread().setContextClassLoader(Connection.class.getClassLoader()); //NOPMD.
    
            StringBuffer sb = new StringBuffer();
            sb.append("com.microsoft.schemas.windowsazurerm"); //schema package name
            _jaxbContext = JAXBContext.newInstance(sb.toString());
        }
        catch (Exception e)
        {
            logger.error(e);
        }
        finally
        {
            Thread.currentThread().setContextClassLoader(cl);
        }
    }
    

    解组器解组器; 对象对象=空; 尝试 { unmarshaller = context.createUnmarshaller(); object = unmarshaller.unmarshal(new StreamSource(new StringReader(xml))); }

    【讨论】:

    • 我已经编辑了原始帖子,添加了我用于解组的代码。请您检查一下。
    • 我无法从您获得的(字符串消息:消息)消息对象中找到。你可以使用这个代码: Unmarshaller unmarshaller;对象对象=空;尝试 { unmarshaller = _jaxbContext.createUnmarshaller(); object = unmarshaller.unmarshal(new StreamSource(new StringReader(xml))); }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    • 2020-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-09
    相关资源
    最近更新 更多