Java JAXB解组中XMLs中的名称空间问题

Java JAXB解组中XMLs中的名称空间问题,java,namespaces,jaxb,unmarshalling,saxparseexception,Java,Namespaces,Jaxb,Unmarshalling,Saxparseexception,我有一个XML要用JAXB解压。如果我从元素中删除所有名称空间属性,代码就可以正常工作,但是如果我保留名称空间属性,则在解组后会得到一个null对象 XML如下所示: <Animal xmlns="http://allmycats.com/serviceplatform/1.0/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> <Cat z:Id="i3" xmlns:z="http://schemas.micros

我有一个XML要用JAXB解压。如果我从元素中删除所有名称空间属性,代码就可以正常工作,但是如果我保留名称空间属性,则在解组后会得到一个null对象

XML如下所示:

<Animal  xmlns="http://allmycats.com/serviceplatform/1.0/" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Cat z:Id="i3" 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>
    @XmlRootElement(name = "Animal")
public class Animal{
    List<Cat> cats;

    @XmlElement(name = "Cat")
    public List<Cat> getCats() {
        return cats;
    }

    public void setCats(List<Cat>cats) {
        this.cats= cats;
    }
}
在运行时,我得到一个空对象。我试图从属性中删除
“z:”
,但出现了以下异常:

org.xml.sax.SAXParseException; The prefix "z" for attribute "z:Id" associated with an element type "Cat" is not bound.]
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://allmycats.com/serviceplatform/1.0/", local:"Animal"). Expected elements are <{}Animal>
如果从cat和Animal中删除名称空间,则会出现以下异常:

org.xml.sax.SAXParseException; The prefix "z" for attribute "z:Id" associated with an element type "Cat" is not bound.]
javax.xml.bind.UnmarshalException: unexpected element (uri:"http://allmycats.com/serviceplatform/1.0/", local:"Animal"). Expected elements are <{}Animal>
我不知道如何处理POJO类中的名称空间和
z:
属性。有什么建议吗


如果我在XML中没有任何名称空间或任何带有名称空间的属性,但我无法更改XML,那么代码可以正常工作。

XMLAtribute有atribute名称空间,所以

@XmlAttribute(name = "Id", namespace="http://schemas.microsoft.com/2003/10/Serialization").
根据xml判断,猫和动物在同一名称空间中,所以

以下代码适用于JDK 7(修复了动物的ns和zid的属性名)

@XmlRootElement(name=“Animal”,名称空间=”http://allmycats.com/serviceplatform/1.0/")
公共类动物2{
列出猫;
@xmlement(name=“Cat”)
公共列表getCats(){
返回猫;
}
公共无效集合猫(列表猫){
这个。猫=猫;
}
}
@XmlRootElement(name=“Cat”)
公共级Cat2{
私有字符串zId;
@XmlAttribute(name=“Id”,命名空间=”http://schemas.microsoft.com/2003/10/Serialization/")
公共字符串getzId(){
返回zId;
}
公共void setzId(字符串zId){
this.zId=zId;
}
私有字符串名称;
@xmlement(name=“name”)
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
}

您的
Cat
具有不同的命名空间。在注释中指定它。我这样做了。。解组后仍然会得到一个空对象。也不例外。我不确定如何处理
Animal
中的
xmlns:I
属性,我已经更改了值,但是名称空间结构是相同的。我将NS添加到
Id
元素,并更改了
Cat
上的NS,但输出仍然是空对象。这可能是由于
Animal
中的
xmlns:i
属性造成的吗?您的xml已损坏,因此有点猜测(而不是),它不应该是i,而应该是xmlns:xsi=”“。获取原始xml文档并为其生成xsd模式(并将其修复为有效的xml)。然后从模式()生成类(IDE也可以为您这样做)。您可以查看它们或将其用作模板来理解命名空间问题。处理名称空间总是一件痛苦的事。对于xml,我很抱歉。我已经修好了。实际的xml是系统生成的,大小超过150MB。所以现在我只有这个复制品了。。。。名称空间和属性都是实际的。从Cat和Animal中删除名称空间,将@xmltattribute(name=“Id”,namespace=“)添加到Id中,它就可以工作了。我在您的xml文件上测试了它(在修复、在Cat和extra>中)我已经将XML和类更新为我现在使用的内容,从Animal和Cat中删除名称空间后,我得到了新的异常:`javax.XML.bind.unmarshaleException:unexpected元素(uri:,local:“Animal”)。预期的元素为`
@XmlRootElement(name = "Animal",namespace = "http://allmycats.com/serviceplatform/1.0/")
public class Animal2{
    List<Cat2> cats;

    @XmlElement(name = "Cat")
    public List<Cat2> getCats() {
        return cats;
    }

    public void setCats(List<Cat2>cats) {
        this.cats= cats;
    }
}
@XmlRootElement(name = "Cat")
public class Cat2 {
    private String zId;

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

    private String name;

    @XmlElement(name = "name")
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
}