我目前正在设计 C ++ 中的专用应用程序,该应用程序必须处理不断发展的XSD方案附带的XML文件。
主要的挑战是:输入XML文件带有基本相似的XSD方案 (它们都是配置数据相同定义标准的不同版本),但在结构和命名方面都有所不同。
Code Synthesis XSD提供了一个很好的基于DOM / SAX的解析器和数据绑定生成器。
通过使用像Apache Xerxes这样的sax-parser,特定于版本的代码可以放在sax-callback-handler中。 这些回调处理程序可以通过'VersionReaderFactory'隐藏,该VersionReaderFactory为特定版本的XML文件返回正确的处理程序。 处理程序会将数据填充到包含必要配置数据的通用数据类中。
Altova提供了一个很好的XSLT处理器,可用于将旧版本的XML定义的配置数据转换为最新版本。 执行此转换后,可以使用“简单”数据绑定来访问数据,因为只有一个版本需要支持。
将XML作为基础格式,XPATH将是查询数据的自然选择。 'home-brew-parser'可以使用一些'VersionReaderFactory',它为特定版本的XML文件返回一组预定义的XPATH查询。 这个'home-brew-parser'将使用必要的配置数据填充通用数据类。
应用程序的哪个部分应该是版本感知的?
XML | Parser | Application
close to data | beneath the application | in the application
您认为哪种方法最适合?
还有其他选择吗?
答案 0 :(得分:1)
回顾起来,以下方法足以满足我99%的需求:
方法:“版本跳变”
对于需要支持的给定XML文件/ XSD-schemes的每个版本,已经创建了XSL-Transformation来将给定的输入文件转换为下一个版本,最后是XML-C ++数据绑定,如下所示:是使用Code Synthesis XSDe生成的。
每当需要支持新版本时,只需在预处理器中添加一个XSLT样式表,并且代码生成基本上是自动的-每个版本都有几个UnitTest,以确保支持新版本不会不会破坏对旧文件的支持。
方法:“提取所需数据”
对于需要支持的给定版本的XML文件/ XSD-shemes的每个版本,已创建XSL转换,以将给定的输入文件转换为仅包含所需数据的另一个文件类型。
通过使用这种方法,可以使用简单的XML方案甚至众所周知的键值存储文件类型(例如json)来收集所需数据。
每当需要支持新版本时,只需将一个新的XSLT文件添加到预处理器中,结果输出文件在所有版本中都将保持不变。
这两种方法的预处理器都可以使用XLST 2+创建,并在Saxon HE上运行。