如标题中所述,我想忽略文档中元素名称的大小写。
static class XY433 {
@XmlAttribute(name = "C200")
String c200;
@XmlAttribute(name = "C215")
String c215;
@XmlAttribute(name="F001")
String f001;
@XmlAttribute(name="f001")
String lcf001; // I want to avoid this duplication
}
我尝试使用Blaise Doughan发布的代码:
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);
}
这实际上是行不通的。
null
2
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 2, Size: 2
at java.util.ArrayList.RangeCheck(ArrayList.java:546)
at java.util.ArrayList.get(ArrayList.java:321)
at com.hre.commons.tec.xml.LowerCaseElementNamesFilter.main(LowerCaseElementNamesFilter.java:58)
对于此XML:
<doc>
<Element ABC="1"></Element>
<element Abc="1"></element>
<element abc="2"></element>
</doc>
您可以将所有属性映射到小写的节点名称,然后包装XMLStreamReader以对其返回的所有属性/元素名称调用toLowerCase()。然后从该XMLStreamReader解组。
我最近为此问题添加了对EclipseLink JAXB(MOXy)的增强请求,请随时提供其他信息:
对象模型
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public 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>
以下是更详细示例的链接:
更新
您的代码可在我的环境中运行(包含随附的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);
}
}
我得到以下输出:
1
1
2
更新#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)
您是否尝试过修改委托?
@Override
public String getAttributeLocalName(int index) {
return super.getAttributeLocalName(index).toLowerCase().intern();
}
@Override
public String getLocalName() {
return super.getLocalName().toLowerCase().intern();
}
问题内容: 我收到一个XML响应,并且它一直在频繁更改(节点不断增加或减少)。在响应xml中的每次更新之后,由于映射的Java类没有所有文件,所以我的代码中断了。 如果响应XML中发生任何更改,是否有任何方法可以避免我的代码中断。 任何帮助将不胜感激。 谢谢。 问题答案: 要处理未知字段,可以添加带注释的属性 输入中与类的显式属性不对应的任何元素都将被扫入此列表。如果该元素是已知的,则将得到未编组
我得到了一个XML响应,它经常变化(节点不断增加或减少)。在响应xml的每次更新之后,我的代码会中断,因为映射的Java类没有所有的文件。 谢了。
我花了一些时间来调查是什么问题,但我不能解决它。当我在XML下面反封送和回封送时,我看到的是不同的XML。 在上面的xml中,只有一个标记(第一个),其余所有(包括名称空间)都是意外元素。另一个应用程序发送上述XML。 null 我真的不明白QName的事
问题内容: HTML中是否有任何方法告诉浏览器不允许对特定元素进行标签索引? 在我的页面上,尽管有一个用jQuery呈现的杂耍,但是当您通过Tab进行制表时,您会在按下Tab控件移动到页面上的下一个可见链接之前获得大量的制表符按下,因为所有通过制表的内容都被隐藏了。视觉上的用户。 问题答案: 您可以使用。 W3C HTML5规范支持负的值: 如果值为负整数 ,则用户代理必须设置元素的tabinde
问题内容: 我的架构指定了一个名称空间,但是文档没有。在JAXB解组(XML-> object)期间忽略名称空间的最简单方法是什么? 换句话说,我有 代替, 问题答案: 我相信你必须将名称空间添加到xml文档中,例如,使用SAX过滤器。 这意味着: 用一个新类定义一个ContentHandler接口,该接口将在JAXB获得它们之前拦截SAX事件。 定义一个XMLReader,它将设置内容处理程序
我正在尝试使用jaxb创建XML,如下所示,其中子元素有单独的命名空间。 我的班级 但我正在像下面这样生成xml,其中子模式位于根级别。 我在package-info.java定义了@xmlschema 当我生成xml时,子元素的名称空间没有被生成,我只得到根元素的命名空间。