gpt4 book ai didi

java - 如何在一个 java 应用程序中处理不同版本的 xsd 文件?

转载 作者:数据小太阳 更新时间:2023-10-29 01:40:39 26 4
gpt4 key购买 nike

事实

在我的 java 应用程序中,我必须同时处理具有不同架构版本(xsd 文件)的 XML 文件。 XML 文件的内容在不同版本之间只发生了一点变化,所以我想主要使用相同的代码来处理它,只是根据所用模式的版本做一些案例区分。

当前解决方案

现在我正在使用 SAX 解析器和我自己的 ContentHandler 解析 XML 文件,忽略模式版本,只检查是否存在我需要处理的标签。

可能的选择

我真的很想使用 JAXB 来生成用于解析 XML 文件的类。这样我就可以从我的 Java 代码中删除所有硬编码的字符串(常量)并改为处理生成的类。

问题

  • 如何使用 JAXB 以统一的方式处理不同的模式版本?
  • 有更好的解决方案吗?

进度

我将模式版本编译为不同的包 v1、v2 和 v3。现在我可以用这种方式创建一个 Unmarshaller:

JAXBContext jc = JAXBContext.newInstance( 
v1.Root.class, v2.Root.class, v3.Root.class );
Unmarshaller u = jc.createUnmarshaller();

现在 u.unmarshal( xmlInputStream ); 从匹配 XML 文件架构的包中给我 Root 类。

接下来我将尝试定义一个接口(interface) 来访问模式的公共(public)部分。 如果您以前做过类似的事情,请告诉我。与此同时,我正在通读 JAXB 规范...

最佳答案

首先,您需要一些方法来识别适合特定实例文档的架构。你说文档有一个 schemaLocation 属性,所以这是一个解决方案。但是请注意,您必须专门配置解析器才能使用此属性,并且恶意文档可能会指定您无法控制的模式位置。相反,我建议获取属性值,并使用它在内部表中查找适当的模式。

接下来是访问数据。您没有说为什么要使用三种不同的模式。唯一合理的原因是不断发展的数据规范(即,模式代表同一数据的版本 1、2 和 3)。如果这不是您的理由,那么您需要重新考虑您的设计。

如果您试图支持不断发展的数据规范,那么您需要回答“我如何处理丢失的数据”这个问题。对此有几个答案:一个是维护代码的多个版本。通过重构通用功能,这不是一个坏主意,但它很容易变得无法维护。

另一种方法是使用单个代码库,以及某种 adapter包含您的规则的对象。如果您走这条路,JAXB 就是错误的解决方案,因为它与模式相关联。您也许能够使用一个许可的 XML->Java 转换器:我相信 XStream会工作,我知道 Practical XML 的 1.1 版会工作(因为我写了它)——尽管你必须自己构建它。

根据模式的复杂性,另一种更好的选择是开发一组使用 XPath 检索数据的对象。我可能会在模式的每个变体中使用包含每个字段的 XPath 表达式的“主”对象来实现。然后创建包含实例文档的 DOM 版本的轻量级“包装器”对象,并使用适合该模式的 XPath。但是请注意,这仅限于只读访问。

关于java - 如何在一个 java 应用程序中处理不同版本的 xsd 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1706859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com