当前位置: 首页 > 知识库问答 >
问题:

JAXB 取消编组的 XML 中的命名空间问题

龙承颜
2023-03-14

我有一个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;
    }
}

在运行时,我得到一个空对象。我试图从属性中删除< code>"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>

下面是解组的最终代码。最后一行给出了一个空指针异常

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类中的名称空间和< code>z:属性。有什么建议吗?

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

共有1个答案

裴俊迈
2023-03-14

XMLAtribute 有 atribute namesape,所以

@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;
    }
}
 类似资料:
  • 我需要你在JAXB编组方面的帮助。这是关于命名空间的。我在这个令人惊叹的网站上阅读了不同的博客和很多答案,但我还没有意识到如何解决我的问题。 我需要用一些复杂的(至少对我来说)名称空间生成一个XML。 如您所见,该XML具有 < code > xmlns:xsi = " http://www . w3 . org/2001/XML schema-instance " 和 http://www.sa

  • 我正在使用 JAXB 来对我正在实现 Java 客户端的 Web 服务进行封送和解组和取消马歇尔请求和响应。然而,我被困在以下回应上,我需要解体。 为了将响应表示为Java对象,我有以下域类: 然后,我执行以下操作来解除元帅: 解编组没有发生任何事件。 对象是使用两个列表创建的。为空,有一项。但是,该项目上的和 null。我认为这与XML命名空间有关,但我无法弄清楚如何修复它。 我尝试了另一种方式

  • 这是我的xml,需要把它转换成Java。我使用了jaxb 并抛出以下异常javax.xml.bind.unmarshalException:意外元素(URI:“http://www.ae.com/event/load”,local:“order”)。需要的元素为<{}LM:order>

  • 我有几个关于JAXB编组的简单问题。我正在尝试封送包含以下字段的类: 只需使用以下序列化代码: 我得到的输出是: 现在,我面临的问题如下: > 我想要名称空间xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance“出现在根元素中,即TokenRestrictionTemplate中,而不是单个子元素中。如何实现这一点? 我有一些元素,例如带有@Xm

  • 我有情况, 有一个sample.xsd(旧版本-没有命名空间)。为同一个XSD文件使用XJC生成JAXB类。我得到了一个使用JAXB类基于XSD解封XML数据文件的示例。sample.xsd文件已更改(新版本-添加的命名空间)。再次为新的XSD文件使用XJC生成JAXB类。该示例已更新,现在可以用于新的XSD文件 现在我有一个情况,我正在获取基于旧XSD的XML数据文件,我想使用更新的示例文件来解

  • 我使用JAXB根据定义的模式封送/解封xml文档。我注意到的是,JAXB在编组的xml中生成了不正确的名称空间。 以下是详细信息- soap.xsd-- 方案1.xsd-- schema2.xsd-- 我为jaxbMarshaller(在我的Spring配置中)定义了一个命名空间Prefix MapperImpl,它将URI映射到我定义的前缀名称。 编组的响应xml如下所示。请注意,JAXB在命名