带有未知@XmlRootElement 的 Jaxb Unmarshall
Jaxb Unmarshall with an unknown @XmlRootElement
在不知道根元素的情况下,我无法实现 unmarshall 一个 XML。例如
<foo>
<bar/>
</foo>
或
<bar>
<bar/>
</bar>
等...
我想将解组结果映射到 class,例如:
// @XmlRootElement ??
public class Container
implements Serializable
{
private Bar bar;
}
我总是需要修复 @XmlRootElement
。
我搜索了如何在运行时设置 @XmlRootElement 但没有成功。有什么想法吗?
我在 Spring 批处理上下文中,我可以使用我选择的解组器。
注意:我不能使用 @XmlElementDecl
或 ObjectFactory
,如图 here 因为 我不知道可能的根名称 .
采用了他的方法:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;
public class Test {
@XmlAccessorType(XmlAccessType.PROPERTY)
public static class Bar {
private String name;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
}
@XmlAccessorType(XmlAccessType.PROPERTY)
public static class Container implements Serializable {
private Bar bar;
public Bar getBar() {
return bar;
}
@XmlElement
public void setBar(Bar bar) {
this.bar = bar;
}
}
public static void main(String[] args) throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(Container.class);
String xml = "<foo><bar><name>Barry</name></bar></foo>";
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
InputStream is = new ByteArrayInputStream(xml.getBytes());
JAXBElement<Container> barWrapperElement = unmarshaller.unmarshal(new StreamSource(is), Container.class);
Container container = barWrapperElement.getValue();
System.out.println(container.getBar().getName());
}
}
有效!
你曾经 XML 有一个根元素,你提到的 xml 有两个文件
<foo>
<bar/>
</foo>
或
<bar>
<bar/>
所以在这里你有两个根名称 foo 或 bar 所以为每个创建两个 classes 如果哪个根名称它将调用 class
在不知道根元素的情况下,我无法实现 unmarshall 一个 XML。例如
<foo>
<bar/>
</foo>
或
<bar>
<bar/>
</bar>
等...
我想将解组结果映射到 class,例如:
// @XmlRootElement ??
public class Container
implements Serializable
{
private Bar bar;
}
我总是需要修复 @XmlRootElement
。
我搜索了如何在运行时设置 @XmlRootElement 但没有成功。有什么想法吗?
我在 Spring 批处理上下文中,我可以使用我选择的解组器。
注意:我不能使用 @XmlElementDecl
或 ObjectFactory
,如图 here 因为 我不知道可能的根名称 .
采用了他的方法:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.Unmarshaller;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.transform.stream.StreamSource;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.Serializable;
public class Test {
@XmlAccessorType(XmlAccessType.PROPERTY)
public static class Bar {
private String name;
public String getName() {
return name;
}
@XmlElement
public void setName(String name) {
this.name = name;
}
}
@XmlAccessorType(XmlAccessType.PROPERTY)
public static class Container implements Serializable {
private Bar bar;
public Bar getBar() {
return bar;
}
@XmlElement
public void setBar(Bar bar) {
this.bar = bar;
}
}
public static void main(String[] args) throws Exception {
JAXBContext jaxbContext = JAXBContext.newInstance(Container.class);
String xml = "<foo><bar><name>Barry</name></bar></foo>";
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
InputStream is = new ByteArrayInputStream(xml.getBytes());
JAXBElement<Container> barWrapperElement = unmarshaller.unmarshal(new StreamSource(is), Container.class);
Container container = barWrapperElement.getValue();
System.out.println(container.getBar().getName());
}
}
有效!
你曾经 XML 有一个根元素,你提到的 xml 有两个文件
<foo>
<bar/>
</foo>
或
<bar>
<bar/>
所以在这里你有两个根名称 foo 或 bar 所以为每个创建两个 classes 如果哪个根名称它将调用 class