JAXB:部分解组返回空域对象

时间:2014-04-02 17:02:39

标签: java xml xml-parsing jaxb unmarshalling

我尝试使用&#34; partial 解组 xml 字符串的<格式良好的部分 jaxb unmarshaling&#34;技术,在this question的答案中描述。

为此,我使用了相应XML模式的JAXB域模型(由xjc创建)的子集。该子集完全对应于XMLStreamReader处理的部分xml字符串。

确保XMLStreamReader位置正确(实际上是第一个元素)之后,我正在调用

 Unmarshaller unmarshaller = JAXBContext.newInstance(jaxbModelClass)
          .createUnmarshaller();

 return unmarshaller.unmarshal(xsr, jaxbModelClass).getValue();

这没有任何异常,返回的对象确实是jaxbModelClass的实例,但它不包含任何子元素(全部设置为{{1} }})。

这是什么原因?

1 个答案:

答案 0 :(得分:0)

以下是如何处理此用例的示例。

XML

以下是我们将使用的XML文档。我们将解组的部分文档从bar元素开始。如果类是手动创建的,或者是从XML Schema生成的,那么无关紧要。

<?xml version="1.0" encoding="UTF-8"?>
<foo xmlns="http://www.example.com">
    <bar>
        <baz>Hello World</baz>
    </bar>
</foo>

Java模型

<强>酒吧

这是我们要解组的课程。请注意,它没有@XmlRootElement注释。

package forum22818252;

public class Bar {

    private String baz;

    public String getBaz() {
        return baz;
    }

    public void setBaz(String baz) {
        this.baz = baz;
    }

}

<强>包信息

由于我们的XML文档是名称空间限定的,我们将使用包级别@XmlSchema注释(请参阅:http://blog.bdoughan.com/2010/08/jaxb-namespaces.html)。

@XmlSchema(
    namespace = "http://www.example.com",
    elementFormDefault = XmlNsForm.QUALIFIED)
package forum22818252;

import javax.xml.bind.annotation.*;

演示代码

<强>演示

下面我们将使用StAX XMLStreamReader解析文档。然后我们将XMLStreamReader推进到我们希望解组的本地根。最后因为我们的类没有与之关联的根元素,所以我们将使用一个带有Class参数的unmarshal方法。

package forum22818252;

import javax.xml.bind.*;
import javax.xml.stream.*;
import javax.xml.transform.stream.StreamSource;

public class Demo {

    public static void main(String[] args) throws Exception {
        XMLInputFactory xif = XMLInputFactory.newFactory();
        StreamSource source = new StreamSource("src/forum22818252/input.xml");
        XMLStreamReader xsr = xif.createXMLStreamReader(source);
        while(!(xsr.isStartElement() && "bar".equals(xsr.getLocalName()))) {
            xsr.next();
        }

        JAXBContext jc = JAXBContext.newInstance(Bar.class);
        Unmarshaller unmarshaller = jc.createUnmarshaller();
        Bar bar = unmarshaller.unmarshal(xsr, Bar.class).getValue();

        System.out.println(bar.getBaz());
    }

}

<强>输出

以下是运行演示代码的输出。

Hello World