栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

如何在JAXB中设置非命名空间的nil和数据类型属性

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

如何在JAXB中设置非命名空间的nil和数据类型属性

您可以将JAXB与StAX解析器一起使用,并执行以下操作:

顾客

域模型中的每个属性都将映射为

@XmlElement(nillable=true,type=Object.class)
。设置
type=Object.class
将强制将
xsi:type
属性写出。

package forum8198945;import java.util.Date;  import javax.xml.bind.annotation.*;@XmlRootElementpublic class Customer {    private String name;    private Customer customerReference;    private Integer quantity;    private Date createdAt;    @XmlElement(nillable=true, type=Object.class)    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    @XmlElement(nillable=true, type=Object.class)    public Customer getCustomerReference() {        return customerReference;    }    public void setCustomerReference(Customer customerReference) {        this.customerReference = customerReference;    }    @XmlElement(nillable=true, type=Object.class)    public Integer getQuantity() {        return quantity;    }    public void setQuantity(Integer quantity) {        this.quantity = quantity;    }    @XmlElement(nillable=true, type=Object.class)    public Date getCreatedAt() {        return createdAt;    }    public void setCreatedAt(Date createdAt) {        this.createdAt = createdAt;    }}

XMLStreamWriterWrapper

我们将为创建一个包装器,以

XMLStreamWriter
剥离所有我们不想写入XML的信息。

package forum8198945;import javax.xml.namespace.NamespaceContext;import javax.xml.stream.XMLStreamException;import javax.xml.stream.XMLStreamWriter;public class XMLStreamWriterWrapper implements XMLStreamWriter {    private XMLStreamWriter xmlStreamWriter;    public XMLStreamWriterWrapper(XMLStreamWriter xmlStreamWriter) {        this.xmlStreamWriter = xmlStreamWriter;    }    public void writeStartElement(String localName) throws XMLStreamException {        xmlStreamWriter.writeStartElement(localName);    }    public void writeStartElement(String namespaceURI, String localName) throws XMLStreamException {        xmlStreamWriter.writeStartElement(namespaceURI, localName);    }    public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {        xmlStreamWriter.writeStartElement(prefix, localName, namespaceURI);    }    public void writeEmptyElement(String namespaceURI, String localName) throws XMLStreamException {        xmlStreamWriter.writeEmptyElement(namespaceURI, localName);    }    public void writeEmptyElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {        xmlStreamWriter.writeEmptyElement(prefix, localName, namespaceURI);    }    public void writeEmptyElement(String localName) throws XMLStreamException {        xmlStreamWriter.writeEmptyElement(localName);    }    public void writeEndElement() throws XMLStreamException {        xmlStreamWriter.writeEndElement();    }    public void writeEnddocument() throws XMLStreamException {        xmlStreamWriter.writeEnddocument();    }    public void close() throws XMLStreamException {        xmlStreamWriter.close();    }    public void flush() throws XMLStreamException {        xmlStreamWriter.flush();    }    public void writeAttribute(String localName, String value) throws XMLStreamException {        xmlStreamWriter.writeAttribute(localName, value);    }    public void writeAttribute(String prefix, String namespaceURI, String localName, String value) throws XMLStreamException {        if("http://www.w3.org/2001/XMLSchema-instance".equals(namespaceURI)) { int colonIndex = value.indexOf(':'); if(colonIndex > -1) {     value = value.substring(colonIndex + 1); } xmlStreamWriter.writeAttribute(localName, value);        } else { xmlStreamWriter.writeAttribute(prefix, namespaceURI, localName, value);        }    }    public void writeAttribute(String namespaceURI, String localName, String value) throws XMLStreamException {        if("http://www.w3.org/2001/XMLSchema-instance".equals(namespaceURI)) { int colonIndex = value.indexOf(':'); if(colonIndex > -1) {     value = value.substring(colonIndex + 1); } xmlStreamWriter.writeAttribute(localName, value);        } else { xmlStreamWriter.writeAttribute(namespaceURI, localName, value);        }    }    public void writeNamespace(String prefix, String namespaceURI) throws XMLStreamException {        if(!"http://www.w3.org/2001/XMLSchema-instance".equals(namespaceURI) && !"http://www.w3.org/2001/XMLSchema".equals(namespaceURI)) { xmlStreamWriter.writeNamespace(prefix, namespaceURI);        }    }    public void writeDefaultNamespace(String namespaceURI) throws XMLStreamException {        if(!"http://www.w3.org/2001/XMLSchema-instance".equals(namespaceURI)) { xmlStreamWriter.writeDefaultNamespace(namespaceURI);        }    }    public void writeComment(String data) throws XMLStreamException {        // TODO Auto-generated method stub    }    public void writeProcessingInstruction(String target) throws XMLStreamException {        // TODO Auto-generated method stub    }    public void writeProcessingInstruction(String target, String data) throws XMLStreamException {        // TODO Auto-generated method stub    }    public void writeCData(String data) throws XMLStreamException {        // TODO Auto-generated method stub    }    public void writeDTD(String dtd) throws XMLStreamException {        // TODO Auto-generated method stub    }    public void writeEntityRef(String name) throws XMLStreamException {        // TODO Auto-generated method stub    }    public void writeStartdocument() throws XMLStreamException {        xmlStreamWriter.writeStartdocument();    }    public void writeStartdocument(String version) throws XMLStreamException {        xmlStreamWriter.writeStartdocument(version);    }    public void writeStartdocument(String encoding, String version) throws XMLStreamException {        xmlStreamWriter.writeStartdocument(encoding, version);    }    public void writeCharacters(String text) throws XMLStreamException {        xmlStreamWriter.writeCharacters(text);    }    public void writeCharacters(char[] text, int start, int len) throws XMLStreamException {        xmlStreamWriter.writeCharacters(text, start, len);    }    public String getPrefix(String uri) throws XMLStreamException {        return xmlStreamWriter.getPrefix(uri);    }    public void setPrefix(String prefix, String uri) throws XMLStreamException {        xmlStreamWriter.setPrefix(prefix, uri);    }    public void setDefaultNamespace(String uri) throws XMLStreamException {        xmlStreamWriter.setDefaultNamespace(uri);    }    public void setNamespaceContext(NamespaceContext context) throws XMLStreamException {        xmlStreamWriter.setNamespaceContext(context);    }    public NamespaceContext getNamespaceContext() {        return xmlStreamWriter.getNamespaceContext();    }    public Object getProperty(String name) throws IllegalArgumentException {        return xmlStreamWriter.getProperty(name);    }}

XMLStreamReaderWrapper

我们需要为此创建一个包装器,

XMLStreamReader
以添加我们在上剥离的所有内容
XMLStreamWriter
XMLStreamReader
因为我们可以扩展,所以这样做更容易
StreamReaderDelegate

package forum8198945;import javax.xml.stream.XMLStreamReader;import javax.xml.stream.util.StreamReaderDelegate;public class XMLStreamReaderWrapper extends StreamReaderDelegate {    public XMLStreamReaderWrapper(XMLStreamReader xmlStreamReader) {        super(xmlStreamReader);    }    @Override    public String getAttributeNamespace(int index) {        String attributeName = getAttributeLocalName(index);        if("type".equals(attributeName) || "nil".equals(attributeName)) { return "http://www.w3.org/2001/XMLSchema-instance";        }        return super.getAttributeNamespace(index);    }}

演示版

以下内容演示了所有内容如何结合在一起:

package forum8198945;import java.io.StringReader;import java.io.StringWriter;import java.util.Date;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLOutputFactory;import javax.xml.stream.XMLStreamWriter;public class Demo {    public static void main(String[] args) throws Exception {        JAXBContext jc = JAXBContext.newInstance(Customer.class);        Customer customer = new Customer();        customer.setName("Alex Dean");        customer.setCustomerReference(null);        customer.setQuantity(1);        customer.setCreatedAt(new Date());        StringWriter stringWriter = new StringWriter();        XMLOutputFactory xof = XMLOutputFactory.newFactory();        XMLStreamWriter xsw = xof.createXMLStreamWriter(stringWriter);        xsw = new XMLStreamWriterWrapper(xsw);        Marshaller marshaller = jc.createMarshaller();        marshaller.marshal(customer, xsw);        String xml = stringWriter.toString();        System.out.println(xml);        XMLInputFactory xif = XMLInputFactory.newFactory();        xif.createXMLStreamReader(new StringReader(xml));        printValue(customer.getName());        printValue(customer.getCustomerReference());        printValue(customer.getQuantity());        printValue(customer.getCreatedAt());    }    private static void printValue(Object value) {        System.out.print(value);        System.out.print(" ");        if(null != value) { System.out.print(value.getClass());        }        System.out.println();    }}

输出量

<?xml version="1.0"?><customer><createdAt type="dateTime">2011-11-25T13:36:49.095</createdAt><customerReference nil="true"></customerReference><name type="string">Alex Dean</name><quantity type="int">1</quantity></customer>Alex Dean class java.lang.Stringnull 1 class java.lang.IntegerFri Nov 25 13:36:49 EST 2011 class java.util.Date


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/506253.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号