我希望为大约20个架构提供XML解析器,代表不同的域数据集。 实例共享一个公共部分INFO,但有一个单独的部分DATA,这在schemata之间是不同的。因此,xml实例具有所有相同的元素类型INFO,但DATA的元素类型不同。
现在,当我收到一段XML时,我首先要知道它属于哪种类型的架构。此信息是INFO的一部分。然后我解析正确的模式,以提取数据。为了找出类型,我想实现一个" common"解析器,其中DATA的类型为= xs:anyType ,并且在解析过程中会忽略其内容,因为我在第二步获取数据。
由于我不想将所有不同的域类型放在一个单一的模式中,因此缺点是不能事先知道要应用的正确模式。我可以应用所有不同的解析器并检查验证错误,但这不是很有效。
这个解决方案是否可以接受,或者是更好的解决方案?
非常感谢!
答案 0 :(得分:1)
如果没有潜水,很难说你的具体情况。
我一般不喜欢xs:anyType
和种类,因为它们过于通用。模式使用这些类型/元素放松了它们的结构目的。
我认为在你的情况下你只需要一些灵活的多态/ inhertitance构造。
您可以考虑以下选项:
xsi:type
上使用DATA
指定其确切的特定类型。这可以帮助您避免在某些环境中进行两阶段解析(在Java,JAXB中,对于instancs,优雅地处理xsi:type
)。 substitutionGroups
。您可以将DATA
定义为抽象元素,然后可以通过不同的具体元素(单个DATA
)替换。请记住,XML Schema通常是定义交换协议的一种方式。所以使用像any
这样的完全通用的结构基本上说“只是发给我一些东西”。如果不了解您的实施情况,就无法理解预期的结果。
对于内部使用案例,一切都很好,但内部事物经常上市,有时会在很短的时间内公布。