我尝试使用&#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} }})。
这是什么原因?
答案 0 :(得分:0)
以下是如何处理此用例的示例。
以下是我们将使用的XML文档。我们将解组的部分文档从bar
元素开始。如果类是手动创建的,或者是从XML Schema生成的,那么无关紧要。
<?xml version="1.0" encoding="UTF-8"?>
<foo xmlns="http://www.example.com">
<bar>
<baz>Hello World</baz>
</bar>
</foo>
<强>酒吧强>
这是我们要解组的课程。请注意,它没有@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