JAXB简单XML解析

时间:2014-09-26 09:44:08

标签: java xml jaxb

请帮我找一下这个JAXB配置有什么问题。我正在解析这个XML。它会抛出异常。

豁免:

group : DummyMaster@ae7b77
group : master
group : null
Exception in thread "main" java.lang.NullPointerException
    at TestDummy.main(TestDummy.java:21)

XML:

<?xml version="1.0" ?>
<master name="master">
    <detail name="detail1">     
    </detail>
    <detail name="detail2">     
    </detail>
</master>

测试:

    JAXBContext jaxbContext = JAXBContext.newInstance(DummyMaster.class);        
    Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();        
    DummyMaster group = (DummyMaster) jaxbUnmarshaller.unmarshal(new File("test1.xml"));
    System.out.println("group : "+group);
    System.out.println("group : "+group.getName());
    System.out.println("group : "+group.getDetails());
    System.out.println("group : "+group.getDetails().size());//Line 21

主人:

@XmlRootElement(name="master")
public class DummyMaster {
private String name;
private List<DummyDetail> details;

@XmlAttribute
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}
@XmlElementWrapper
@XmlElement
public List<DummyDetail> getDetails() {
    return details;
}
public void setDetails(List<DummyDetail> details) {
    this.details = details;
}    
}

明细:

@XmlRootElement(name="detail")
public class DummyDetail {
private String name;

@XmlAttribute
public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}
}

3 个答案:

答案 0 :(得分:2)

您在此行收到NullPointerException:

System.out.println("group : "+group.getDetails().size());

鉴于上面的行被执行,唯一可能的解释是getDetails()返回null,这意味着当你尝试调用size()时,你得到一个NPE。

选项1

这是因为您的XML不包含详细信息包装元素。

将您的XML更改为:

<?xml version="1.0" ?>
<master name="master">
  <details>
    <detail name="detail1">     
    </detail>
    <detail name="detail2">     
    </detail>
  </details>
</master>

选项2

在DummyMaster类中,完全删除@XmlElementWrapper注释,并使用@XmlElement(name =“detail”)注释getDetails方法。

然后按照原来的方式保留XML。

答案 1 :(得分:2)

更改您的DummyMaster类删除@XmlElementWrapper并添加@XmlElement(name =&#34; detail&#34;)

@XmlRootElement(name="master")
public class DummyMaster {

    private String name;
    private List<DummyDetail> details;

    @XmlAttribute
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }


    @XmlElement(name = "detail")
    public List<DummyDetail> getDetails() {
        return details;
    }

    public void setDetails(List<DummyDetail> details) {
        this.details = details;
    }
}

答案 2 :(得分:1)

根据需要选择任何方式

  1. 仅更改DummyMaster#getDetails() (不使用xml元素包装)

    //1. comment out XmlElementWrapper
    //2. name with XmlElement
    //@XmlElementWrapper
    @XmlElement(name="detail")
    public List<DummyDetail> getDetails() {
        return details;
    }
    
  2. 更改DummyMaster#getDetails() xml 文件撰写(使用xml元素包装器)

    //method 
    @XmlElementWrapper(name="details")
    @XmlElement(name="detail")
    public List<DummyDetail> getDetails() {
        return details;
    }
    
    //in xml <details> should wrap child <detail> tag
    <details>
       <detail name="detail1">     
       </detail>
       <detail name="detail2">     
      </detail>
    </details>
    
相关问题