您可以将所有属性映射到小写的节点名称,然后包装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();}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)