Вы можете использовать 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>