在我的Java应用程序中,我必须同时处理具有不同架构版本的XML文件(xsd文件)。XML文件的内容在不同版本之间仅发生了少许变化,因此我想主要使用相同的代码来处理它,并根据所使用架构的版本进行一些区分大小写的操作。
现在,我正在使用SAX解析器解析XML文件,而我自己ContentHandler
忽略了架构版本,只是检查是否存在需要处理的标签。
我真的很想使用JAXB生成用于解析XML文件的类。这样,我可以从Java代码中删除所有硬编码的字符串(常量),并使用生成的类来处理。
我将架构版本编译为不同的软件包v1,v2和v3。现在,我可以创建Unmarshaller
这种方式:
JAXBContext jc = JAXBContext.newInstance(
v1.Root.class, v2.Root.class, v3.Root.class );
Unmarshaller u = jc.createUnmarshaller();
现在u.unmarshal( xmlInputStream );
给我Root
包装中与XML文件模式匹配的类。
接下来,我将尝试定义一个interface
访问架构的公共部分。 如果您以前做过这样的事情,请告诉我 。同时,我正在阅读JAXB规范…
首先,您需要某种方式来标识适合于特定实例文档的架构。您说文档具有schemaLocation
属性,所以这是一种解决方案。但是请注意,您必须专门配置解析器以使用此属性,并且恶意文档可能会指定您无法控制的架构位置。相反,我建议获取属性值,并使用它在内部表中找到适当的架构。
接下来是访问数据。您没有说为什么要使用三种不同的架构。唯一合理的原因是数据规范的发展(即,模式表示同一数据的版本1、2和3)。如果这不是您的原因,那么您需要重新考虑您的设计。
如果您要支持不断发展的数据规范,则需要回答“我该如何处理丢失的数据”的问题。有两个答案:一个是维护代码的多个版本。通过重构通用功能,这不是一个坏主意,但是很容易变得难以维护。
替代方法是使用单个代码库和某种包含规则的适配器对象。而且,如果沿着这条路走,JAXB是错误的解决方案,因为它与模式相关。您也许可以使用允许的XML->
Java转换器:我相信XStream可以工作,而且我知道实用XML
1.1版本可以工作(自从我写以来),尽管您必须自己构建它。
根据架构的复杂性,另一个更好的选择是开发一组使用XPath检索数据的对象。我可能会使用“主”对象来实现,该对象包含模式的每个变体中每个字段的XPath表达式。然后创建轻量级的“包装器”对象,该对象包含您的实例文档的DOM版本,并使用适合该架构的XPath。但是请注意,这仅限于只读访问。
我有一个Java应用程序,其中包括两个第三方JAR(Amazon Kinesis和MaxMind GeoIP2),每个JAR都使用不同版本的Jackson。两个版本的Jackson都不适用于这两个第三方罐子。 此外,我正在运行Apache的maven JAR pluging-它创建一个包含所有依赖类的uber JAR。 鉴于我不能更改第三方JAR,我不知道如何才能让每个第三方JAR调用杰克逊的适当
我正在使用java-8进行多个Spring boot项目,但现在其中一个需要转移到java-11。所以我需要在笔记本电脑上安装两个版本。那么如何在同一台机器上为不同的项目处理不同的JAVA版本呢?
我希望能够向用户公开一个表示XML文件的对象。这可以用许多库(xmlBeans、JAXB…)来完成,并且一切都很好,直到我必须支持该XML文件的不同版本(不断演变的模式问题)以实现向后兼容性。 我希望这对于我的用户来说是完全透明的,这意味着是我的系统需要决定在某个时间点需要使用哪个版本的XML文件。 下面是我想要实现的一个简短的伪代码: 版本独立对象-这是当时在系统上找到的XML文件的对象表示(可
问题内容: 例如,代替打印 / - \ / 在新行上制作,使其停留在一行上,并且是动画吗? 问题答案: 是的,打印(退格)以删除最后一个字符。简而言之: 请注意,这并不在Eclipse控制台中由于错误工作。但是,在命令控制台中,它应该可以正常工作。
问题内容: 假设我为使用版本10内核的OS制作了一个映像,如果我在运行版本9内核的主机OS上为该映像运行一个容器,那么Docker会表现出什么行为?那版本11呢? 版本的向后兼容性重要吗?我出于好奇而问,因为文档仅讨论“最低Linux内核版本”等。这听起来像主机运行的内核版本超出该最低值无关紧要。这是真的?有警告吗? 问题答案: 假设我为使用版本10内核的操作系统制作映像。 我认为这是一个误解
有人能想出一个变通方法来解决osascript索引按名称瓶颈引用同一应用程序的多个实例吗? 如果我们获得两个进程id-一个用于同一个应用程序的两个不同实例,osascript返回相同的实例来交换其中一个pid-就像它首先将pid映射到一个应用程序名称,然后检索具有该名称的第一个应用程序进程一样。 例如,启动两个不同的VLC实例。应用程序,播放两个不同的视频文件,类似: 然后获取两个单独的应用程序进