在 JAXB 或 Xstream 中,是否可以在解组期间过滤掉类型/值上的某些子元素

2024-04-29

希望大家都好,快速提问看看是否有人有任何反馈。

过去两天我正在尝试 JaxB 和 Xstream。我基本上使用 XML 库将 XML 编组到 Java 对象或从 Java 对象中解组。这是一项非常简单的任务,我很快就完成了。但是,我想要解组到 Java 对象列表中的 XML 非常长,并且包含许多可以忽略的子元素,并且不会将其放入 Java 对象列表中。 例如,xml 看起来类似于:

<?xml version="1.0" encoding="UTF-8"?>
<Tables>
    <Table1>
        <TYPE>Test1</TYPE>
        <DATE>2014-01-16</DATE>
        <FLAG>True</FLAG>
    </Table1>
    <Table1>
        <TYPE>Test2</TYPE>
        <DATE>2014-01-15</DATE>
        <FLAG>False</FLAG>
    </Table1>
    <Table1>
        <TYPE>Test1</TYPE>
        <DATE>2014-01-14</DATE>
        <FLAG>True</FLAG>
    </Table1>
</Tables>

因此,我希望库能够迭代所有 xml 元素并解组到迄今为止有效的 java 对象列表中,但是在迭代时,我想添加其他功能来检查 Type 和 Flag 元素值(如果 TYPE 值等于) Test2 和/或如果 Flag 值等于 False,则忽略此子元素,并且不将其包含在 Java 对象的完成列表中。有谁知道这对于 JaxB 或 Xstream 是否可行?或者,任何人都可以建议一种更好的方法来完成此任务,该方法需要最少的代码和手动解析。

我一直在研究 JaxB 中的 ValidationEventHandler 和 XmlAdapter,但我认为这些不允许我做我想做的事情。我与 Xmldapter 很接近,但是 unmarshal 必须为其处理的每个 xml 子元素返回 null 或一个对象,它还将 xml 语法更改为属性形式,即 TYPE = "Test1" 等,我没有看到任何改变的方法。

Xstream 允许您实现具有 canConvert 方法的转换器,但这仅适用于类类型,而不适用于我想要检查每个子元素的子元素类型。看看可以在 Xstream 中重载的 MapperWrapper wrapMapper 方法,但它只显示元素属性名称,即 FLAG 并且不显示值,而且如果它确实显示值,我也看不到告诉函数忽略子根元素以及该孩子的所有属性。

无论如何,这是我的两分钱。有什么建议吗?


如果您选择 EclipseLink MOXy 作为 JAXB 实现(而不是默认实现),则可以在 Java 类上使用注释来进行使用 XPath 表达式的解组。这可用于过滤掉某些输入。链接在这里:http://www.eclipse.org/eclipselink/moxy.php http://www.eclipse.org/eclipselink/moxy.php

或者,可能更简单的是,将 XML 转换 API 与样式表一起使用,该样式表具有过滤掉不需要的内容的模板。请检查班级javax.xml.bind.util.JAXBResult http://docs.oracle.com/javase/7/docs/api/javax/xml/bind/util/JAXBResult.html,它允许您从一个源进行转换(例如InputStream or InputReader) 直接到 Java 对象。将其视为中间有变压器的解组。

编辑: 我将帮助您掌握基本的 XSLT 和一些代码。 这是可以执行您所描述的操作的样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

    <xsl:output method="xml" version="1.0" encoding="UTF-8" indent="yes"/>

    <xsl:template match="node()|@*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*" />
        </xsl:copy>
    </xsl:template>

    <xsl:template match="Table1[TYPE = 'Test1' or FLAG = 'True']">
        <!-- Don't do anything, since we want to filter these Table1 elements out -->
    </xsl:template>

</xsl:stylesheet>

以及可以作为基础的代码摘录:

//Obtain a TransformerFactory
//Obtain a Source for your stylesheet, like a StreamSource
Transformer transformer = transformerFactory.newTransformer(source);

//Next, create an Unmarshaller from a JAXBContext
Unmarshaller unmarshaller = context.createUnmarshaller();

//Create a JAXBResult with the Unmarshaller
JAXBResult result = new JAXBResult(unmarshaller);

//Obtain a Source for your input XML, and transform
transformer.transform(inputSource, result);

//Get the JAXBElement from the result
final JAXBElement<?> jaxbEl = (JAXBElement<?>)result.getResult();

//And now your unmarshalled Java bean from the JAXBElement
Object bean = jaxbEl.getValue();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 JAXB 或 Xstream 中,是否可以在解组期间过滤掉类型/值上的某些子元素 的相关文章

  • Mockito 在调用参数数量可变的方法时使用参数匹配器

    我试图在对具有可变数量参数的方法的调用中使用参数匹配器 Java 中的东西 没有成功 我的代码如下 我还将列出我尝试用来完成此工作的所有行 import static org mockito Mockito public class Met
  • 如何将 javax.persistence.Column 定义为 Unsigned TINYINT?

    我正在基于 MySQL 数据库中的现有表创建 Java 持久性实体 Bean 使用 NetBeans IDE 8 0 1 我在这个表中遇到了一个字段 其类型为 无符号 TINYINT 3 我发现可以执行以下操作将列的类型定义为 unsign
  • 如何将画廊意图中的“打开”更改为“完成”?

    我使用以下意图打开画廊来选择多个图像和视频 Intent intent new Intent intent setType image video intent putExtra Intent EXTRA ALLOW MULTIPLE tr
  • 通过SOCKS代理连接Kafka

    我有一个在 AWS 上运行的 Kafka 集群 我想用标准连接到集群卡夫卡控制台消费者从我的应用程序服务器 应用程序服务器可以通过 SOCKS 代理访问互联网 无需身份验证 如何告诉 Kafka 客户端通过代理进行连接 我尝试了很多事情 包
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • 是否有任何简单(且最新)的 Java 框架可用于在 Swing 应用程序中嵌入电影?

    我正在构建一个小型 Swing 应用程序 我想在其中嵌入一部电影 重要的是 这个应用程序是一个 WebStart 应用程序 并且该库应该能够打包在我启动的 jnlp 中 即 不依赖于本机库 我知道并尝试过 JMF 但我认为与其他框架相比 其
  • 如何在 Antlr4 中为零参数函数编写语法

    我的函数具有参数语法 如下面的词法分析器和解析器 MyFunctionsLexer g4 lexer grammar MyFunctionsLexer FUNCTION FUNCTION NAME A Za z0 9 DOT COMMA L
  • org.hibernate.QueryException:无法解析属性:文件名

    我正在使用休眠Criteria从列中获取值filename在我的桌子上contaque recording log 但是当我得到结果时 它抛出异常 org hibernate QueryException 无法解析属性 文件名 com co
  • Integer.parseInt("0x1F60A") 以 NumberformatException 结束

    我尝试从数据库中获取长字符串内的表情符号代码 格式如下 0x1F60A 所以我可以访问代码 但它将是String 起初 我尝试通过执行以下操作来转换变量tv setText beforeEmo getEmijoByUnicode int e
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • Jackson XML ArrayList 输出具有两个包装器元素

    我在 Jackson 生成的 XML 输出中得到了两个包装器元素 我只想拥有一个 我有一个 Java bean Entity Table name CITIES JacksonXmlRootElement localName City pu
  • 自动生成Flyway的迁移SQL

    当通过 Java 代码添加新模型 字段等时 JPA Hibernate 的自动模式生成是否可以生成新的 Flyway 迁移 捕获自动生成的 SQL 并将其直接保存到新的 Flyway 迁移中 以供审查 编辑 提交到项目存储库 这将很有用 预
  • 套接字的读写如何同步?

    我们创建一个套接字 在套接字的一侧有一个 服务器 在另一侧有一个 客户端 服务器和客户端都可以向套接字写入和读取 这是我的理解 我不明白以下事情 如果服务器从套接字读取数据 它在套接字中是否只看到客户端写入套接字的内容 我的意思是 如果服务
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • QuerySyntaxException:无法找到类

    我正在使用 hql 生成 JunctionManagementListDto 类的实际 Java 对象 但我最终在控制台上出现以下异常 org hibernate hql internal ast QuerySyntaxException
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • org.apache.commons.net.io.CopyStreamException:复制时捕获 IOException

    我正在尝试使用以下方法中的代码将在我的服务器中创建的一些文件复制到 FTP 但奇怪的是我随机地低于错误 我无法弄清楚发生了什么 Exception org apache commons net io CopyStreamException
  • 配置“DataSource”以使用 SSL/TLS 加密连接到 Digital Ocean 上的托管 Postgres 服务器

    我正在尝试托管数据库服务 https www digitalocean com products managed databases on 数字海洋网 https en wikipedia org wiki DigitalOcean 创建了
  • 在浏览器刷新中刷新检票面板

    我正在开发一个付费角色系统 一旦用户刷新浏览器 我就需要刷新该页面中可用的统计信息 统计信息应该从数据库中获取并显示 但现在它不能正常工作 因为在页面刷新中 java代码不会被调用 而是使用以前的数据加载缓存的页面 我尝试添加以下代码来修复

随机推荐

  • 将事件绑定到尚未创建的 DOM 元素 (jquery)

    如何将事件绑定到脚本加载时不存在的 html 元素 我的脚本的一部分将这些添加到 DOM 中 a class btn remove item href link a 问题是我不能这样做 document ready function btn
  • 音乐播放器请求写入外部存储权限?

    我正在 Android 中创建一个音乐播放器应用程序 它工作正常 但每当我滚动歌曲列表时 它就会开始崩溃并给出此异常 Process com example lenovo musicplayer PID 31100 java lang Se
  • 如何将所有输入字段值更改为大写

    我有一组 PHP 字段 在将值发送到查询之前 我想将字母更改为大写 有没有办法做类似的事情 cust name john cust gender male lower upper conversion 那么现在 john 已更改为 JOHN
  • 流式音频播放延迟(约 200 毫秒)

    我有一个播放流式音频数据的应用程序 如聊天客户端 该工作流程涉及三个简单步骤 首先发送文件头信息 采样率 每个样本的位数和通道数 音频波形输出设备根据上述参数进行初始化 音频 pcm 数据被发送并在上述设备上播放 数据接收代码是本机的 C
  • ASP.Net webform生成Excel文件到本地PC而不是服务器

    继有关生成 Excel 文件的问题后 我需要能够在 Webform 应用程序位于远程 Web 服务器上时在本地创建文件 这不是我以前处理过的事情 所以我发现很难确切地问什么 我在 VS2010 上使用 C 的 WebForms 伊安德森 h
  • 如何减少Scala中创建的对象数量?

    我正在 Scala 中编写一个计算机图形应用程序 它使用 RGB 类返回图像中某个点的颜色 正如你可以想象的 返回颜色 RGB 对象的函数被调用了很多次 class RGB val red Int val green Int val blu
  • 如何TDD UIGestureRecognizers?

    在尝试使用 UIGestureRecognizer 编写 TDD 代码时 我发现无法以编程方式验证目标操作 如果没有这个 我不确定我是否可以正确测试它 如果手势识别器在 IB 中设置 支持 iOS 5 则目标动作会在 NIB Storybo
  • 无法在捆绑执行时安装 Locomotive CMS

    我正在尝试安装 LocomotiveCMS 并尝试遵循本指南 http doc locomotivecms com guides get started install engine http doc locomotivecms com g
  • Android 13 (SDK 33):Bundle.getSerialized(String) 已弃用,有什么替代方案?

    从 API 级别 33 开始getSerializable String Bundle 类的方法已弃用 文档建议使用getSerializable String Class 反而 但该功能仅适用于 API 级别 33 我当前的代码 val
  • Python 独有的 XML 规范化 (xml-exc-c14n)

    在 Python 中 我需要规范化 c14n XML 字符串 我可以使用哪个模块 包来实现此目的 我应该怎么做 我更喜欢使用默认的 python 2 7 模块 无需额外安装或补丁 参考见 http www w3 org TR xml exc
  • PHP 致命错误:未捕获错误:未找到“Facebook\WebDriver\ChromeOptions”类

    namespace Facebook WebDriver use Facebook WebDriver Remote DesiredCapabilities use Facebook WebDriver Remote RemoteWebDr
  • 二叉搜索树中序遍历

    我对这段代码感到困惑 void in order traversal iterative BinaryTree root stack
  • “class java.lang.String”中名为“tablename”的属性没有 getter

    我收到错误There is no getter for property named tablename in class java lang String 当我使用mybatis时 我的映射器 xml 是这样的
  • 如何使图像保留在 CSS 网格容器的行中?

    下面的代码显示了当我调整窗口大小时的预期行为 Chrome 60 和 Firefox 55 中 但 iOS Safari 10 3 中除外 这很可能是它在 Safari 中行为不当的另一个问题 html body width 100 hei
  • 没有 ProfilePage 索引,但我有 LoginAndSignupPage

    我有一个前两天突然出现的问题 我有一个 prestashop 模块 可以让我从 Instagram 页面检索图像 它运行得很好 但突然之间 什么都不起作用了 我有一个错误 ProfilePage 未定义的索引 我做了很多var dump 我
  • 从 URL 中删除文件扩展名

    我从未使用过 mod rewrite 但我想从网站的网址中删除所有文件扩展名 我需要遵循什么规则才能做到这一点 我已经尝试过这个 但是每次我单击网站上的链接时都会出现内部错误 RewriteRule 1 php L Options Mult
  • 使用 client_body_in_file_only 进行 nginx 文件上传

    晚上好 我需要将静态内容上传到 nginx 服务器 1 9 因此上传模块不适用于此版本 我读过这篇文章 Nginx 直接文件上传 无需通过后端传递 https coderwall com p swgfvw nginx direct file
  • WPF 动画第一次不运行

    我有一个窗口 其目的是在显示时淡入 第一次使用时 动画不会运行 在后续使用中 效果很好 这是一个请求者 我实例化它来显示一些东西 我不会保留它并重新使用实例 我实例化请求者 设置各种属性 例如 Top 和 Left 然后调用 ShowDia
  • MKMapview 将图钉放置在位置(长/纬度)

    我有纬度和长值 我需要能够在这个位置放置图钉 有人可以提供一些关于如何解决这个问题的建议吗 找到下面非常简单的解决方案 将引脚放置在由以下定义的给定位置CL位置坐标二维 http developer apple com library ma
  • 在 JAXB 或 Xstream 中,是否可以在解组期间过滤掉类型/值上的某些子元素

    希望大家都好 快速提问看看是否有人有任何反馈 过去两天我正在尝试 JaxB 和 Xstream 我基本上使用 XML 库将 XML 编组到 Java 对象或从 Java 对象中解组 这是一项非常简单的任务 我很快就完成了 但是 我想要解组到