JAXB 解组忽略命名空间将元素属性变成 null

2024-02-16

我正在尝试使用 JAXB 将 xml 文件解组为对象,但遇到了一些困难。实际项目的 xml 文件中有几千行,因此我以较小的规模重现了错误,如下所示:

XML 文件:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<catalogue title="some catalogue title" 
           publisher="some publishing house" 
           xmlns="x-schema:TamsDataSchema.xml"/>

用于生成 JAXB 类的 XSD 文件

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
 <xsd:element name="catalogue" type="catalogueType"/>

 <xsd:complexType name="catalogueType">
  <xsd:sequence>
   <xsd:element ref="journal"  minOccurs="0" maxOccurs="unbounded"/>
  </xsd:sequence>
  <xsd:attribute name="title" type="xsd:string"/>
  <xsd:attribute name="publisher" type="xsd:string"/>
 </xsd:complexType>
</xsd:schema>

代码片段1:

final JAXBContext context = JAXBContext.newInstance(CatalogueType.class);
um = context.createUnmarshaller();
CatalogueType ct = (CatalogueType)um.unmarshal(new File("file output address"));

这会引发错误:

javax.xml.bind.UnmarshalException: unexpected element (uri:"x-schema:TamsDataSchema.xml", local:"catalogue"). Expected elements are <{}catalogue>
 at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.handleEvent(UnmarshallingContext.java:642)
 at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:247)
 at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportError(Loader.java:242)
 at com.sun.xml.bind.v2.runtime.unmarshaller.Loader.reportUnexpectedChildElement(Loader.java:116)
 at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext$DefaultRootLoader.childElement(UnmarshallingContext.java:1049)
 at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext._startElement(UnmarshallingContext.java:478)
 at com.sun.xml.bind.v2.runtime.unmarshaller.UnmarshallingContext.startElement(UnmarshallingContext.java:459)
 at com.sun.xml.bind.v2.runtime.unmarshaller.SAXConnector.startElement(SAXConnector.java:148)
 at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.startElement(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.AbstractXMLDocumentParser.emptyElement(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl$NSContentDispatcher.scanRootElementHook(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)
 at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(Unknown Source)
 at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(Unknown Source)
    ...etc

因此,XML 文档中的命名空间会导致问题,不幸的是,如果将其删除,它可以正常工作,但由于该文件是由客户端提供的,因此我们只能使用它。我尝试了多种在 XSD 中指定它的方法,但似乎没有一种排列有效。

我还尝试使用以下代码来解组​​忽略名称空间:

Unmarshaller um = context.createUnmarshaller();
final SAXParserFactory sax = SAXParserFactory.newInstance();
sax.setNamespaceAware(false);
final XMLReader reader = sax.newSAXParser().getXMLReader();
final Source er = new SAXSource(reader, new InputSource(new FileReader("file location")));
CatalogueType ct = (CatalogueType)um.unmarshal(er);
System.out.println(ct.getPublisher());
System.out.println(ct.getTitle());

工作正常,但无法解组元素属性和打印

null
null

由于我们无法控制的原因,我们仅限于使用 Java 1.5,而我们正在使用 JAXB 2.0,这很不幸,因为第二个代码块使用 Java 1.6 按需要工作。

任何建议将不胜感激,替代方案是在解析文件之前将名称空间声明从文件中删除,这似乎不优雅。


感谢您的这篇文章和您的代码片段。它确实让我走上了正确的道路,因为我也疯狂地试图处理一些供应商提供的 XML,这些 XMLxmlns="http://vendor.com/foo"到处都是。

我的第一个解决方案(在阅读您的文章之前)是将 XML 放入字符串中,然后xmlString.replaceAll(" xmlns=", " ylmns=");(恐怖,恐怖)。除了冒犯我的感受之外,处理来自 InputStream 的 XML 时也很痛苦。

我的第二个解决方案,在查看你的代码片段之后:(我正在使用Java7)

// given an InputStream inputStream:
String packageName = docClass.getPackage().getName();
JAXBContext jc = JAXBContext.newInstance(packageName);
Unmarshaller u = jc.createUnmarshaller();

InputSource is = new InputSource(inputStream);
final SAXParserFactory sax = SAXParserFactory.newInstance();
sax.setNamespaceAware(false);
final XMLReader reader;
try {
    reader = sax.newSAXParser().getXMLReader();
} catch (SAXException | ParserConfigurationException e) {
    throw new RuntimeException(e);
}
SAXSource source = new SAXSource(reader, is);
@SuppressWarnings("unchecked")
JAXBElement<T> doc = (JAXBElement<T>)u.unmarshal(source);
return doc.getValue();

但现在,我找到了我更喜欢的第三个解决方案,希望这对其他人有用:如何在架构中正确定义预期的命名空间:

<xsd:schema jxb:version="2.0"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
  xmlns="http://vendor.com/foo"
  targetNamespace="http://vendor.com/foo"
  elementFormDefault="unqualified"
  attributeFormDefault="unqualified">

这样,我们现在可以删除sax.setNamespaceAware(false);行(更新:实际上,如果我们保留unmarshal(SAXSource)打电话,然后我们需要sax.setNamespaceAware(true)。但更简单的方法是不去打扰SAXSource以及围绕其创建的代码unmarshal(InputStream)默认情况下是名称空间感知的。 marshal() 的输出也有正确的命名空间。

是的。只用了4个小时左右就完事了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JAXB 解组忽略命名空间将元素属性变成 null 的相关文章

  • Java中有没有一种方法可以通过名称实例化一个类?

    我正在寻找问题 从字符串名称实例化一个类 https stackoverflow com questions 9854900 instantiate an class from its string name它描述了如何在有名称的情况下实例
  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 为什么 JTables 使 TableModel 在呈现时不可序列化?

    所以最近我正在开发一个工具 供我们配置某些应用程序 它不需要是什么真正令人敬畏的东西 只是一个具有一些 SQL 脚本生成功能并创建几个 XML 文件的基本工具 在此期间 我使用自己的 AbstractTableModel 实现创建了一系列
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • 如何使用assertEquals 和 Epsilon 在 JUnit 中断言两个双精度数?

    不推荐使用双打的assertEquals 我发现应该使用带有Epsilon的形式 这是因为双打不可能100 严格 但无论如何我需要比较两个双打 预期结果和实际结果 但我不知道该怎么做 目前我的测试如下 Test public void te
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • Eclipse Maven Spring 项目 - 错误

    I need help with an error which make me crazy I started to study Java EE and I am going through tutorial on youtube Ever
  • 内部类的构造函数引用在运行时失败并出现VerifyError

    我正在使用 lambda 为内部类构造函数创建供应商ctx gt new SpectatorSwitcher ctx IntelliJ建议我将其更改为SpectatorSwitcher new反而 SpectatorSwitcher 是我正
  • 如何在用户输入数据后重新运行java代码

    嘿 我有一个基本的java 应用程序 显示人们是成年人还是青少年等 我从java开始 在用户输入年龄和字符串后我找不到如何制作它它们被归类为 我希望它重新运行整个过程 以便其他人可以尝试 的节目 我一直在考虑做一个循环 但这对我来说没有用
  • 如何访问JAR文件中的Maven资源? [复制]

    这个问题在这里已经有答案了 我有一个使用 Maven 构建的 Java 应用程序 我有一个资源文件夹com pkg resources 我需要从中访问文件 例如directory txt 我一直在查看各种教程和其他答案 但似乎没有一个对我有
  • 尝试将 Web 服务部署到 TomEE 时出现“找不到...的 appInfo”

    我有一个非常简单的项目 用于培训目的 它是一个 RESTful Web 服务 我使用 js css 和 html 创建了一个客户端 我正在尝试将该服务部署到 TomEE 这是我尝试部署时遇到的错误 我在这里做错了什么 刚刚遇到这个问题 我曾
  • java for windows 中的文件图标叠加

    我正在尝试像 Tortoise SVN 或 Dropbox 一样在文件和文件夹上实现图标叠加 我在网上查了很多资料 但没有找到Java的解决方案 Can anyone help me with this 很抱歉确认您的担忧 但这无法在 Ja
  • 专门针对 JSP 的测试驱动开发

    在理解 TDD 到底是什么之前 我就已经开始编写测试驱动的代码了 在没有实现的情况下调用函数和类可以帮助我以更快 更有效的方式理解和构建我的应用程序 所以我非常习惯编写代码 gt 编译它 gt 看到它失败 gt 通过构建其实现来修复它的过程
  • Android:无法使用 DbHelper 和 Contract 类将数据插入 SQLite

    public class Main2Activity extends AppCompatActivity private EditText editText1 editText2 editText3 editText4 private Bu
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 长轮询会冻结浏览器并阻止其他 ajax 请求

    我正在尝试在我的中实现长轮询Spring MVC Web 应用程序 http static springsource org spring docs 2 0 x reference mvc html但在 4 5 个连续 AJAX 请求后它会
  • 如果没有抽象成员,基类是否应该标记为抽象?

    如果一个类没有抽象成员 可以将其标记为抽象吗 即使没有实际理由直接实例化它 除了单元测试 是的 将不应该实例化的基类显式标记为抽象是合理且有益的 即使在没有抽象方法的情况下也是如此 它强制执行通用准则来使非叶类抽象 它阻止其他程序员创建该类

随机推荐

  • GMP mpz_array_init 是一个过时的函数 - 我们应该如何初始化 mpz 数组?

    只使用了GNU MP Bignum 库 https gmplib org index html dir有几次 我很感兴趣地发现我以前分配 启动数组的方式现在已经过时了 从整数特殊函数 https gmplib org manual Inte
  • Rails 3.1:有深度嵌套模型的教程吗?

    我正在寻找 Rails 3 1 的工作教程 该教程将逐步向您展示如何创建 3 层深度的嵌套模型 The 复杂形式 截屏视频 http railscasts com episodes 73 complex forms part 1在 Rail
  • AndroidAnnotations + Android Studio - 找不到生成的 null.R 类

    我已经使用最新版本的 AndroidStudio 按照 wiki 说明设置了 ActiveAndroid 我正在使用产品口味 这是我的 gradle 构建文件 apply plugin android apply plugin androi
  • 为什么 IE10 中的“font-size: 1em”比 Chrome 中的字体大?

    我目前正在开发一个网站 我不明白为什么文本在 IE10 中显示比在 Chrome 中更大 我已确保两个浏览器都设置为 100 缩放 不多也不少 我的 CSS 已重置 body font size 1em 在 Chrome v27 0 145
  • 如何使用 ggplot2 在同一绘图区域内绘制绘图的缩放?

    这个问题看起来很难理解 但是为了说明一下 我举个图来举例 我正在尝试复制这张图 到目前为止 我已经单独完成了图形 但我不知道如何将它们组合在一起 如示例所示 有什么帮助吗 time lt seq from 0 to 10 by 0 5 li
  • 文件夹被锁定,无法解锁

    当我尝试更新或提交项目中的代码时 它告诉我该文件夹已锁定 当我尝试 释放锁定 时 它说该工作空间中没有任何内容可以解锁 这意味着什么 为什么我无法更新 提交甚至清理项目 右键单击您的 Subversion 工作目录文件夹 然后选择Torto
  • 在 Macos 上,rails new 失败并显示“无法设置其他经过身份验证的数据”

    我正在尝试让 ruby on Rails 在带有 M1 芯片的新 Mac 上运行 跑步rails new之后失败append gitignore出现以下错误 Library Ruby Gems 2 6 0 gems activesuppor
  • VS2010 程序集加载错误

    当我尝试在 Visual Studio 2010 中构建 ASP NET 4 项目时 出现以下错误 无法加载文件或程序集 file C Dev project trunk bin Elmah dll 或其依赖项之一 不支持操作 HRESUL
  • 如何将容器作为服务的参数

    在我的服务构造函数中 public function construct EntityManager entityManager SecurityContextInterface securityContext this gt securi
  • Tastypie 和原始 sql

    如何让 Tastypie 获取原始 SQL 查询集 queryset Foo objects raw sql 似乎不起作用 难道不可能吗 queryset super class name self get query set return
  • runnodes 时发生非法反射访问操作

    我正在尝试运行我的 corda 节点 但我遇到了一个奇怪的问题 节点正在正确启动 正如您在日志中看到的那样 C Repositorio cordapp template kotlin build nodes gt runnodes log
  • 如何在 Python (2.7 + ) 中等待 ENTER 键按下? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想知道一种简单的方法来等待用户按下特定的键 例如 Enter 或 Escape 但不是两者 然后在感应到按键后进一步执行代码 Try r
  • 如何在 Laravel 项目中添加 jQuery

    我是 Laravel 框架的新手 我想在使用 Laravel 框架构建的 Web 应用程序中使用 jQuery 但不知道怎么链接jQuery 库在 Laravel 项目中 你可以使用在线图书馆
  • 在数据框的列上进行 Strsplit [重复]

    这个问题在这里已经有答案了 我有一个data frame其中变量之一是向量 或列表 如下所示 MyColumn lt c A B C D E F G MyDF lt data frame group id 1 4 val 11 14 cat
  • 如何使用正则表达式搜索带括号的字符串?

    我有一个 txt 文件 其中包含以下字符串 A 123 B 456 Ab 123 我想搜索Ab 123 在txt文件中 我尝试过的 re search r Ab 123 string 有 12 个具有特殊含义的字符 您可以使用以下命令转义到
  • 与 preg_match_all 匹配

    我得到这个正则表达式 val 123 4 56 regex preg match all regex val matches 谁能告诉我为什么这只匹配最后一个数字 56 而不是每组数字 这是上面的正则表达式运行后 matches 包含的内容
  • 使用不带 InvokePattern 或 clickablePoint 的 UI Automation在单击按钮时调用

    我尝试将点击消息发送到 或调用 另一个应用程序中的按钮 我使用 UISpy exe 并可以找到我需要的元素 但它没有 id 没有 clickablePoint 也没有 Invoke 模式 我尝试了以下代码 var processStartI
  • 一种为对象数据库建立索引的方法

    我正在使用对象数据库 ZODB 来存储许多对象之间的复杂关系 但遇到了性能问题 因此 我开始构建索引以加快对象检索和插入速度 这是我的故事 希望对您有所帮助 最初 当我向数据库添加对象时 我会将其插入专用于该对象类型的分支中 为了防止多个对
  • 没有 JDK 的 JRE 6 (Windows) 上的堆转储

    有没有办法在没有安装 JDK 的远程计算机上创建堆转储 我无法更改安装 设置 并且它在 Windows 上运行 所以我可以随时访问命令行工具 问题是远程计算机上的 Java 应用程序冻结 没有内存不足异常 因此 XX HeapDumpOnO
  • JAXB 解组忽略命名空间将元素属性变成 null

    我正在尝试使用 JAXB 将 xml 文件解组为对象 但遇到了一些困难 实际项目的 xml 文件中有几千行 因此我以较小的规模重现了错误 如下所示 XML 文件