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

2023-12-08

正如标题中所述,我想忽略文档中元素名称的大小写。

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) 的增强请求,请随时提供其他信息:

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

对象模型

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>

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

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

UPDATE

您的代码可以在我的环境中运行(JDK 1.6.0_20 包含 JAXB 和 EclipseLink JAXB (MOXy) 2.2,我还使用 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();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何忽略 JaxB 中元素名称的大小写 的相关文章

随机推荐

  • 在 mongodb 中使用“group by”选择 Max()

    请帮我将这个选择语句转换为mongodb Select Name Max Value From table1 Group By Name 我读过这个文档 http www mongodb org display DOCS Aggregati
  • android 评级栏 xml 和 numStars

    我是 XML 设计的初学者 D 这是我的评级栏和朋友的 XML
  • 为什么 ArrayList<>.add() 不起作用?

    我是 Java 新手 目前正在使用 Android Studio 我只是不明白为什么 add 不起作用 主题和作业只是自定义课程 问题是弹出消息 无法解析符号 添加 整个过程失败 我已经导入了 java util ArrayList Arr
  • 如何在 Angular 中正确实现 ngOnDestroy() ?

    我有一个带有计时器的子组件 每 2 秒我向服务器发送 api 调用 只要用户在页面上 即使他 她要去参加婚礼并保持页面 父组件窗口 打开 我就需要执行此调用 这是我的组件中的一些代码 this myTimer Observable time
  • M2 上的轨道:dyld[...]:缺少名为的符号

    我将 Rails 项目从 5 升级到 6 现在 Rails 命令在我的 M2 mac 上抛出此错误 dyld missing symbol called 它看起来像是 Node 和 mysql gem 的某种问题 当我使用 SQLite 创
  • 在堆栈项目中添加 MaybeT 依赖项时遇到错误

    我正在关注这个教程网络爬虫使用HXT 我这里使用的是堆栈 在为 MaybeT 添加依赖项时 它要求 建议的操作 尝试将以下内容添加到 Users Haskell Development Scraper stack yaml 中的额外 dep
  • 如何使用 SOAP V2 为 Magento 设置自定义 api?

    我使用的是 Magento 1 4 1 1 我正在尝试使用 SOAP v2 在 API 中设置自定义函数 我让它适用于 SOAP v1 但我需要 v2 以便 C 可以使用它 对于 v2 该函数显示在 WSDL 中 但总是返回此错误 过程 t
  • 我在春天使用加载时间编织。如何在码头设置类加载器?

    我在春天使用加载时间编织 一切都可以在 websphere 上正常工作 因为它有自己的类加载器 但我在开发模式下遇到了麻烦 我使用嵌入式码头 如何在码头设置类加载器 当我运行它时 我看到以下错误 INFO org springframewo
  • 使用VBS自动截图

    我在从域中执行登录脚本时遇到问题 该脚本从本地电脑调用另一个批处理脚本 问题在于组策略之一是限制批处理脚本运行并禁用 cmd exe 有没有办法将我的批处理脚本转换为 vbscript 其中它使用 nircmd exe 每隔一分钟捕获一次屏
  • 如何找到数字数组中的前两个连续元素?

    例如 使用 Ruby 2 4 我有一个唯一的有序数字数组 1 7 8 12 14 15 如何找到差值为1的前两个元素 例如 上面的数组的答案是 7 和 8 你可以使用each cons and find从对数组中获取第一个元素 其中第二个元
  • OpenCV 与 C# 位图读取 jpg 文件

    经过多次实验 我发现在C OpenCV 中读取彩色jpg文件 auto temp cv imread xxx jpg 与使用 C 位图读取同一文件不同 var temp new bitmap xxx jpg 结果不同 如果我对它们应用一些算
  • ClipCursor 成功,但实际上什么也没做

    我正在编写一个非常简单的程序来将鼠标剪辑到指定的窗口 它从系统托盘运行 没有可见窗口 因为同一个窗口会有多个实例 所以它使用EnumWindows 迭代每个顶级窗口并将它们的 hwnd 与GetForegroundWindow 当 true
  • 通过 Cloud Datastore API 连接到开发中的 AppEngine 数据存储

    我们目前正在运行一个组合的 AppEngine GCE 应用程序 到目前为止 我们所有的数据存储访问都保留在 AppEngine 方面 现在我们正在探索允许我们的 GCE 实例对 共享 数据存储进行一些查询 首先 我试图弄清楚如何在本地运行
  • Java - 如何以多种方式对对象进行排序:Arrays.sort()、Comparable

    假设我有一个包含对象的数组 其中有一些员工 对象 他们都有 int age double salary 我想对这个数组进行排序 以便我的类实现Comparable
  • 从 Java 中的 ping 结果中解析出时间部分

    我设法修改一个程序来 ping 对等计算机并获取 ping 计数 我怎样才能解析出time ms实时 ping 计数结果 Code public static void main String args String ip 192 168
  • 在 Chrome 打包应用程序中抑制“无法加载资源:net::ERR_FILE_NOT_FOUND”

    当 Chrome 打包应用程序中的 Web 视图尝试加载不存在的本地文件时 我在控制台中收到消息 无法加载资源 net ERR FILE NOT FOUND 这是预期的 因为程序应该检查几个不同的位置 从本地系统开始 然后切换到远程服务器作
  • 检查 Android 是否有活动的互联网连接

    我正在尝试在我的应用程序中编写一个部分来区分活动 Wifi 连接和实际的互联网连接 使用连接管理器查找是否有活动的 Wifi 连接非常简单 但是每次我尝试测试在 Wifi 连接但没有互联网连接时是否可以连接到网站时 我都会陷入无限循环 我尝
  • VB.NET 数组 = 数组

    我正在尝试创建一个程序 在其中将数组分配给数组 它们是这样声明的 常量 Deck Size 52 私人甲板 Deck Size Table Deck Deck Size 作为字符串 所以 在我的程序中我写了这一行 甲板 Table Deck
  • 使用 rvest 进行网页抓取时出现 R 内存问题

    我在用rvest在 R 中进行网页抓取 我遇到了内存问题 我有一个 28 625 x 2 的字符串数据框 称为urls其中包含我正在抓取的页面的链接 框架的一行包含两个相关链接 我想生成一个 28 625 x 4 数据框Final以及从链接
  • 如何忽略 JaxB 中元素名称的大小写

    正如标题中所述 我想忽略文档中元素名称的大小写 static class XY433 XmlAttribute name C200 String c200 XmlAttribute name C215 String c215 XmlAttr