JAXB 解组集合

Posted

技术标签:

【中文标题】JAXB 解组集合【英文标题】:JAXB unmarshall a collection 【发布时间】:2011-08-05 14:39:39 【问题描述】:

我有一个 XML 文档:

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

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

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


    

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

【问题讨论】:

【参考方案1】:

你不应该在这里使用@XmlElementWrapper,而应该使用@XmlElement

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

【讨论】:

有关 JAXB 和集合的更多信息,请参阅:bdoughan.blogspot.com/2010/09/jaxb-collection-properties.html

以上是关于JAXB 解组集合的主要内容,如果未能解决你的问题,请参考以下文章

JAXB 继承,解组到编组类的子类

JAXB 解组@XmlAnyElement

解组 JAXB 编组列表失败并出现 NullPointerException

解组非根元素时的 JAXB 模式验证

使用 DTD 文件导致的 JAXB 解组 XML 时出错

Java/JAXB:根据属性将 Xml 解组为特定子类