Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

JAXB unmarshall a collection

I have an XML doc:

<?xml version="1.0" encoding="UTF-8"?>

<Log>
    <logEntry>
       <severity>WARN</severity>
       <dateTime>2011-03-17 15:25</dateTime>
       <message>Here is the text from the application</message>
       <class>(class name)</class>
       <program> TB Reception</program>
    </logEntry>

    <logEntry>
       <severity>WARN</severity>
       <dateTime>2011-03-17 15:25</dateTime>
       <message>Here is the text from the application</message>
       <class>(class name)</class>
       <program> TB Reception</program>
    </logEntry>
</Log>

and two POJOs:

package org.jwes.jaxb.jax;

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

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="Log")
public class Log {
    @XmlElementWrapper(name = "logEntry")
    private List<LogEntry> logList;

    public List<LogEntry> getLogEntries() {
        return logList;
    }

    public void setLogEntries(List<LogEntry> logList) {
        this.logList = logList;
    }


}

package org.jwes.jaxb.jax;

import java.io.Serializable;

import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlElementWrapper;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name="LogEntry")
public class LogEntry{


    private String source;
    private String message;
    private String severity;
    private String program;
    private String className;


    public String getSource() {
        return source;
    }
    public void setSource(String source) {
        this.source = source;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getSeverity() {
        return severity;
    }
    public void setSeverity(String severity) {
        this.severity = severity;
    }
    public String getProgram() {
        return program;
    }
    public void setProgram(String program) {
        this.program = program;
    }
    @XmlElement(name = "class")
    public String getClassName() {
        return className;
    }
    public void setClassName(String className) {
        this.className = className;
    }
}

I'd like to retrieve the values of the XML nodes using JAXB. I wrote this quick code:

public class App 
{
    public static void main( String[] args ) throws JAXBException, IOException
    {
        JAXBContext jc = JAXBContext.newInstance(Log.class);

        Unmarshaller um = jc.createUnmarshaller();
        Log logElement=(Log)um.unmarshal(new FileReader("src/main/resources/log.xml"));
        System.out.println(logElement.getLogEntries().toArray().length);


    }
}

When i run it I always get value of zero.

like image 415
jwesonga Avatar asked Apr 14 '11 14:04

jwesonga


People also ask

How do you Unmarshal XML?

To unmarshal an xml string into a JAXB object, you will need to create an Unmarshaller from the JAXBContext, then call the unmarshal() method with a source/reader and the expected root object.

How does JAXB marshalling work?

In JAXB, marshalling involves parsing an XML content object tree and writing out an XML document that is an accurate representation of the original XML document, and is valid with respect the source schema. JAXB can marshal XML data to XML documents, SAX content handlers, and DOM nodes.

What is Unmarshal operation?

“Unmarshalling” is the process of converting some kind of a lower-level representation, often a “wire format”, into a higher-level (object) structure. Other popular names for it are “Deserialization” or “Unpickling”.


1 Answers

You shouldn't be using @XmlElementWrapper here, just @XmlElement:

@XmlRootElement(name="Log")
public class Log {
    @XmlElement(name = "logEntry")
    private List<LogEntry> logList;
like image 83
skaffman Avatar answered Oct 14 '22 21:10

skaffman