在我的测试实用程序代码中,我打印了这样的XML内容。
public static <T> void printXml(final Class<T> type, final T instance)
throws JAXBException {
final JAXBContext context = JAXBContext.newInstance(type);
final Marshaller marshaller = context.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
if (type.getAnnotation(XmlRootElement.class) == null) {
marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
final XmlType xmlType = type.getAnnotation(XmlType.class);
// xmlType.name() -> "##default"
marshaller.marshal(
new JAXBElement<>(new QName(xmlType.namespace(),
xmlType.name()), type, instance),
System.out);
return;
}
marshaller.marshal(instance, System.out);
}
@XmlRootElement
的类型工作正常。
但是当我尝试打印一个没有@XmlRootElement
的类型时,我得到了这个。
<##default xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
...
</##default>
xmlns
部分没问题。 marshaller找到了我想要的namespaceUri。
问题是,请参阅##default
?,如何找到名称部分?
我想要这个。
<someName xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="...">
...
</someName>
答案 0 :(得分:2)
如果未在注释中指定名称,则默认为##default
。要处理这种情况,您需要执行JAXB impls所做的操作,并将JSR-222规范中定义的算法应用于短类名以获取名称。