如何忽略JaxB中元素名称的大小写

如何忽略JaxB中元素名称的大小写,第1张

如何忽略JaxB中元素名称的大小写

您可以将所有属性映射到小写的节点名称,然后包装XMLStreamReader以对其返回的所有属性/元素名称调用toLowerCase()。然后从该XMLStreamReader解组。

我最近为此问题添加了对Eclipselink JAXB(MOXy)的增强请求,请随时提供其他信息:

  • https://bugs.eclipse.org/bugs/show_bug.cgi?id=331241

对象模型

import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlRootElement;@XmlRootElementpublic class Customer {    private int id;    private String name;    private Address address;    @XmlAttribute    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Address getAddress() {        return address;    }    public void setAddress(Address address) {        this.address = address;    }}public class Address {    private String street;    public String getStreet() {        return street;    }    public void setStreet(String street) {        this.street = street;    }}

示范代码

import java.io.FileInputStream;import javax.xml.bind.JAXBContext;import javax.xml.bind.Marshaller;import javax.xml.bind.Unmarshaller;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamReader;import javax.xml.stream.util.StreamReaderDelegate;public class Demo {    public static void main(String[] args) throws Exception {        JAXBContext jc = JAXBContext.newInstance(Customer.class);        XMLInputFactory xif = XMLInputFactory.newInstance();        XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("input.xml"));        xsr = new MyStreamReaderDelegate(xsr);        Unmarshaller unmarshaller = jc.createUnmarshaller();        Customer customer = (Customer) unmarshaller.unmarshal(xsr);        Marshaller marshaller = jc.createMarshaller();        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);        marshaller.marshal(customer, System.out);    }    private static class MyStreamReaderDelegate extends StreamReaderDelegate {        public MyStreamReaderDelegate(XMLStreamReader xsr) { super(xsr);        }        @Override        public String getAttributeLocalName(int index) { return super.getAttributeLocalName(index).toLowerCase();        }        @Override        public String getLocalName() { return super.getLocalName().toLowerCase();        }    }}

将阅读以下XML文档:

<CUSTOMER ID="1">    <NAME>Jane Doe</NAME>    <ADDRESS>        <STREET>123 A Street</STREET>    </ADDRESS></CUSTOMER><CuSToMeR Id="1">    <NaMe>Jane Doe</NAME>    <AdDrEsS>        <STREET>123 A Street</STREET>    </AdDRrEsS></CuSToMeR>

并编写以下XML:

<customer id="1">   <address>      <street>123 A Street</street>   </address>   <name>Jane Doe</name></customer>

以下是更详细示例的链接:

  • http://bdoughan.blogspot.com/2010/12/case-insensitive-unmarshalling.html

更新

您的代码可在我的环境中运行(包含随附的JAXB和Eclipselink JAXB(MOXy)2.2的JDK
1.6.0_20,我也在使用StAX的默认实现)。当我运行您的示例时:

import java.io.FileInputStream;import java.util.List;import javax.xml.bind.JAXBContext;import javax.xml.bind.Unmarshaller;import javax.xml.bind.annotation.XmlAttribute;import javax.xml.bind.annotation.XmlElement;import javax.xml.bind.annotation.XmlRootElement;import javax.xml.stream.XMLInputFactory;import javax.xml.stream.XMLStreamReader;import javax.xml.stream.util.StreamReaderDelegate;public class Example {    private static class ToLowerCaseNamesStreamReaderDelegate extends StreamReaderDelegate {        public ToLowerCaseNamesStreamReaderDelegate(XMLStreamReader xsr) { super(xsr);        }        @Override        public String getAttributeLocalName(int index) { return super.getAttributeLocalName(index).toLowerCase();        }        @Override        public String getLocalName() { return super.getLocalName().toLowerCase();        }    }    @XmlRootElement(name="doc")    static class Doc {        @XmlElement(name="element")        List<Element> elements;    }    static class Element {        @XmlAttribute(name = "abc")        String abc;    }    public static void main(String[] args) throws Exception {        XMLInputFactory xif = XMLInputFactory.newInstance();        XMLStreamReader xsr = xif.createXMLStreamReader(new FileInputStream("LowerCaseElementNamesFilterTest.xml"));        Unmarshaller u = JAXBContext.newInstance(Doc.class).createUnmarshaller();        //Do unmarshalling        Doc doc = (Doc) u.unmarshal(new ToLowerCaseNamesStreamReaderDelegate(xsr));        System.out.println(doc.elements.get(0).abc);        System.out.println(doc.elements.get(1).abc);        System.out.println(doc.elements.get(2).abc);    }}

我得到以下输出:

112

更新#2

讲话:

线程“ main”中的异常javax.xml.bind.UnmarshalException-
带有链接的异常:[javax.xml.bind.UnmarshalException:需要插入解组器的名称空间URI和本地名称。]位于com.sun.xml.bind。
v2.runtime.unmarshaller.UnmarshallerImpl.handleStreamException(UnmarshallerImpl.java:425)位于com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:362)位于com.sun.xml.bind
v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:332)

您是否尝试过修改委托?

@Overridepublic String getAttributeLocalName(int index) {    return super.getAttributeLocalName(index).toLowerCase().intern();}@Overridepublic String getLocalName() {    return super.getLocalName().toLowerCase().intern();}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5506498.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-13

发表评论

登录后才能评论

评论列表(0条)

保存