2011-04-14 76 views
10

我有一个XML文档:JAXB解组集合

<?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> 

和两个的POJO:

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; 
    } 
} 

我想用检索XML节点的值JAXB。我写了这个快速代码:

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); 


    } 
} 

当我运行它时,我总是得到零值。

回答

9

你不应该使用@XmlElementWrapper这里,只是@XmlElement

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

感谢@skaffman这工作就像一个魅力! – jwesonga 2011-04-14 14:57:35

+2

有关JAXB和集合的更多信息,请参阅:http://bdoughan.blogspot.com/2010/09/jaxb-collection-properties.html – 2011-04-14 15:02:29