Bạn có thể tận dụng JAXBIntrospector phải làm như sau:
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 {
}
}
Với đoạn mã trên khi JAXBElement được marshalled nó sẽ được đủ điều kiện với một xsi: thuộc tính type tương ứng với kiểu lược đồ thích hợp:
<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>
Để loại bỏ chứng chỉ bạn chỉ có thể thay đổi dòng tạo ra JAXBElement thành:
JAXBElement jaxbElement = new JAXBElement(new QName("ROOT"), value.getClass(), value);
này sẽ dẫn đến việc XML sau:
<ROOT>Hello World</ROOT>
Nguồn
2010-11-10 17:13:58
Hoạt động hoàn hảo! Có lẽ bạn biết cách loại bỏ thuộc tính 'xsi: type'? Đây là những gì tôi nhận được cho một đối tượng 'String':' (239) 555 2390 ' –
yegor256
@Vincenzo Tôi đã cập nhật câu trả lời của mình với các chi tiết về cách loại bỏ thuộc tính xsi: type. –
@BlaiseDoughan vui lòng xem vấn đề này: http://stackoverflow.com/questions/26816798/objectfactory-methods-generated-by-jaxb – Spartan