【问题标题】:Issue with namespaces in XMLs in JAXB unmarshallingJAXB 解组中 XML 中的命名空间问题
【发布时间】:2015-04-21 10:02:52
【问题描述】:

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

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>

我的Animal bean是这样的:

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

Cats bean 是这样的:

@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,则代码可以正常工作。

【问题讨论】:

  • 您的Cat 具有不同的命名空间。在注释中指定。
  • 我做到了.. 解组后我仍然得到一个空对象。没有例外。我不确定如何处理Animal 中的xmlns:i 属性@

标签: java namespaces jaxb unmarshalling saxparseexception


【解决方案1】:

XMLAtribute 有属性命名,所以

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

【讨论】:

  • 我已经更改了值,但命名空间结构是相同的。我将 NS 添加到 Id 元素并更改了 Cat 上的 NS,但输出仍然是空白对象。这可能是由于Animal 中的xmlns:i 属性造成的吗?
  • 您的 xml 已损坏,因此有点猜测( 而不是 ),它不应该是 i,而是 xmlns:xsi="w3.org/2001/XMLSchema-instance"。获取您的原始 xml 文档并为其生成 xsd 架构freeformatter.com/xsd-generator.html#ad-output(并修复它直到它是有效的 xml)。然后从模式 (stackoverflow.com/questions/11463231/…) 生成您的类(您的 IDE 也可以为您完成)。您可以对它们进行 tweek 或用作模板来了解命名空间问题。处理命名空间总是很痛苦。
  • 对 xml 感到抱歉。我已经修好了。实际的 xml 是系统生成的,大小超过 150 MB。所以这个副本是我现在所拥有的一切......命名空间和属性都是真实的。
  • 从 Cat 和 Animal 中删除命名空间,将 @XmlAttribute(name = "Id", namespace = "schemas.microsoft.com/2003/10/Serialization/") 添加到 Id 并且它可以工作。我在你的 xml 文件上对其进行了测试(在修复 ,在猫和额外>)
  • 我已将 XML 和类更新为我现在正在使用的内容,从 Animal 和 Cat 中删除命名空间后,我得到了新的异常:` javax.xml.bind.UnmarshalException: unexpected element (uri:“allmycats.com/serviceplatform/1.0”,本地:“动物”)。预期元素是 `
猜你喜欢
  • 2014-06-07
  • 2020-11-30
  • 1970-01-01
  • 2014-11-07
  • 2012-08-28
  • 2021-05-12
  • 2014-11-28
  • 2018-05-01
  • 2016-09-21
相关资源
最近更新 更多