【问题标题】:Jaxb unmarshalls empty list with namespace [duplicate]Jaxb 使用命名空间解组空列表 [重复]
【发布时间】:2015-04-25 00:48:32
【问题描述】:

我有一个要解组的简单 xml。但我在输出中只得到一个空列表。不抛出异常。 这是第三方生成的 xml,我需要在不更改 xml 的情况下完成这项工作。

XML:

<Animal  xmlns="http://allmycats.com/serviceplatform/1.0/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Cat z:Id="i1" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
<name>kitty</name>
</Cat>
<Cat z:Id="i2" xmlns:z="http://schemas.microsoft.com/2003/10/Serialization/">
<name>kitty2</name>
</Cat>
</Animal>

Animal 的 POJO bean:

@XmlRootElement(name = "Animal",namespace = "http://allmycats.com/serviceplatform/1.0/")

public class Animal{
    List<Cat> cats;
    @XmlElement(name = "Cat")
    public List<Cat> getCats() {
        return cats;
    }
    public void setCats(List<Cat>cats) {
        this.cats= cats;
    }
}

Cat 的 POJO bean

@XmlRootElement(name = "Cat")
public class Cat {
    private String zId;
    private String name;
    @XmlAttribute(name = "Id", namespace="http://schemas.microsoft.com/2003/10/Serialization/")
    public String getzId() {
        return zId;
    }
    public void setzId(String zId) {
        this.zId = zId;
    }
    @XmlElement(name = "name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}

解组码是:

File file = new File(filepath);
System.out.println("file exists? : "+ file.exists()); // prints true

JAXBContext jaxbContext = JAXBContext.newInstance(Animal2.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
Animal2 animals = (Animal2)jaxbUnmarshaller.unmarshal( file );
System.out.println("--file size: "+animals.getCats().size());

最后一行给出了一个空指针异常。

我在 BEAN 类中的命名空间有什么问题吗?我是 Jaxb 的新手,这个问题困扰了我 3 天! 我之前问过这个问题,但无法得到正确的答案,这是一个更准确的问题。

【问题讨论】:

  • @Zielu .. 是的,它是重复的,但也许我的问题之前并不清楚,解决方案没有奏效。因此,我用干净的代码和 xml 再次询问它。感谢您的 cmets,但我仍然遇到这个问题。

标签: java xml jaxb xml-namespaces unmarshalling


【解决方案1】:

Animal.java

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "Animal",namespace = "http://allmycats.com/serviceplatform/1.0/")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Animal", propOrder = {
    "cats"
})
public class Animal implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @XmlElement(name = "Cat")
    protected List<Cat> cats;

    public List<Cat> getCats() {
        if (cats == null) { // This solve the nullpointer
            cats = new ArrayList<Cat>();
        }
        return this.cats;
    }

}

Cat.java

import java.io.Serializable;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name = "Cat")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Cat", propOrder = {
        "name"
})
public class Cat implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @XmlAttribute(name = "Id", namespace="http://schemas.microsoft.com/2003/10/Serialization/")
    private String zId;

    @XmlElement(name = "name")
    private String name;

    public String getzId() {
        return zId;
    }

    public void setzId(String zId) {
        this.zId = zId;
    }

    public String getName() {
        return name;
    }

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


}

【讨论】:

  • 感谢您的回复。但是现在,我得到的不是空指针,而是一个空白列表。最后一行的getCats() 返回一个空列表,其中没有数据。
  • @RijuMahna 你使用上面的类和我添加的所有注释吗? ..奇怪..您使用的是哪个JDK?在我的环境中工作正常
  • 是的,我实际上已经复制粘贴了您的代码进行测试。我正在使用 JDK 7.. 我什至尝试将 setCats 方法添加到 Animal 类,因为它在您的代码中丢失了.. 但仍然是相同的结果。 :(
  • 日居是时候学习调试了。我们都给了你相同的答案,我们都检查过它是否有效。只需使用您的代码编组/解组,检查输出 xml,查看失败的方向(错误的 xml,也不能正确读取......)
  • @Zielu 。 .我确实将一些数据编组到 xml 中,并且名称空间结果完全不同。父 Animal 标签现在有一个命名空间。创建的xml是:&lt;?xml version="1.0" encoding="UTF-8" standalone="yes"?&gt; &lt;ns3:Animal xmlns:ns2="http://schemas.microsoft.com/2003/10/Serialization/" xmlns:ns3="http://allmycats.com/serviceplatform/1.0/"&gt; &lt;Cat ns2:Id="i34"&gt; &lt;name&gt;myKitty1&lt;/name&gt; &lt;/Cat&gt; &lt;Cat ns2:Id="i35"&gt; &lt;name&gt;myKitty2&lt;/name&gt; &lt;/Cat&gt; &lt;/ns3:Animal&gt;现在不知道该怎么办..
猜你喜欢
  • 2014-11-07
  • 1970-01-01
  • 2013-10-24
  • 2015-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多