我有一个对象value
,它是某种类型的,@XmlRootElement
- 注释或不注释。我想把它编组成XML:
String value1 = "test";
assertEquals("<foo>test</foo>", toXml("foo", value1));
// ...
@XmlRootElement
class Bar {
public String bar = "test";
}
assertEquals("<foo><bar>test</bar></foo>", toXml("foo", new Bar()));
我可以使用JAXB现有设施吗,或者我应该创建一些自定义分析器?
答案 0 :(得分:22)
您可以利用JAXBIntrospector执行以下操作:
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBIntrospector;
import javax.xml.bind.Marshaller;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.namespace.QName;
public class Demo {
public static void main(String[] args) throws Exception {
Object value = "Hello World";
//Object value = new Bar();
JAXBContext jc = JAXBContext.newInstance(String.class, Bar.class);
JAXBIntrospector introspector = jc.createJAXBIntrospector();
Marshaller marshaller = jc.createMarshaller();
if(null == introspector.getElementName(value)) {
JAXBElement jaxbElement = new JAXBElement(new QName("ROOT"), Object.class, value);
marshaller.marshal(jaxbElement, System.out);
} else {
marshaller.marshal(value, System.out);
}
}
@XmlRootElement
public static class Bar {
}
}
使用上面的代码,当JAXBElement被编组时,它将使用对应于相应模式类型的xsi:type属性进行限定:
<ROOT
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xs="http://www.w3.org/2001/XMLSchema" xsi:type="xs:string">Hello World</ROOT>
要取消资格,您只需将创建JAXBElement的行更改为:
JAXBElement jaxbElement = new JAXBElement(new QName("ROOT"), value.getClass(), value);
这将产生以下XML:
<ROOT>Hello World</ROOT>
答案 1 :(得分:3)
以下是如何编组value1
,String
。您可以将yourObject.getClass()
传递给JAXBElement
构造函数和value1
:
try {
JAXBContext jc = JAXBContext.newInstance();
Marshaller m = jc.createMarshaller();
String value1 = "test";
JAXBElement jx = new JAXBElement(new QName("foo"), value1.getClass(), value1);
m.marshal(jx, System.out);
} catch (JAXBException ex) {
ex.printStackTrace();
}
这不使用@XmlRootElement
。上面代码的结果是:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><foo>test</foo>
另一方面,这不适用于Bar
对象:javax.xml.bind.JAXBException: myPackage.Bar is not known to this context
。但是,您可以从Bar
内部获取值,并使用该值创建JAXBElement
,而不是对象本身。
答案 2 :(得分:1)
我没有找到任何好的通用方法。这是我的通用解决方案。
myFunc(){...}
答案 3 :(得分:0)
如果没有用@XmlRootElement
注释,那么JAXB没有足够的信息来编组它。您需要首先将其包装在JAXBElement
中。
你可以做一些反思性的爱,以了解如何将对象包装在适当的JAXBElement
中吗?