编程语言
首页 > 编程语言> > java-JAXB中的XML中的名称空间反编组问题

java-JAXB中的XML中的名称空间反编组问题

作者:互联网

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

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

猫豆就像:

@XmlRootElement(name = "Cat")
public class Cat {
    private String zId;

    @XmlAttribute(name = "z: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;
    }
}

在运行时,我得到一个空对象.我尝试从属性中删除“ z:”,但出现了以下异常:

org.xml.sax.SAXParseException; The prefix "z" for attribute "z:Id" associated with an element type "Cat" is not bound.]

如果从cat和Animal中删除名称空间,则会出现以下异常:

javax.xml.bind.UnmarshalException: unexpected element (uri:"http://allmycats.com/serviceplatform/1.0/", local:"Animal"). Expected elements are <{}Animal>

最终的编组代码如下.最后一行给出了空指针异常

File file = new File(filepath1);
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());

我不确定如何处理POJO类中的名称空间和z:属性.有什么建议吗?

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

解决方法:

XMLAtribute具有名称名ape,因此

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

通过xml判断时,猫与动物位于同一个命名空间中,因此

以下代码可与JDK 7一起使用(固定了ns的动物名称和属性名的zid).

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

标签:unmarshalling,java,jaxb,namespaces,saxparseexception
来源: https://codeday.me/bug/20191012/1901883.html