使用XSD xs:anyType

时间:2014-10-16 09:07:38

标签: xml xsd

我希望为大约20个架构提供XML解析器,代表不同的域数据集。 实例共享一个公共部分INFO,但有一个单独的部分DATA,这在schemata之间是不同的。因此,xml实例具有所有相同的元素类型INFO,但DATA的元素类型不同。

现在,当我收到一段XML时,我首先要知道它属于哪种类型的架构。此信息是INFO的一部分。然后我解析正确的模式,以提取数据。为了找出类型,我想实现一个" common"解析器,其中DATA的类型为= xs:anyType ,并且在解析过程中会忽略其内容,因为我在第二步获取数据。

由于我不想将所有不同的域类型放在一个单一的模式中,因此缺点是不能事先知道要应用的正确模式。我可以应用所有不同的解析器并检查验证错误,但这不是很有效。

这个解决方案是否可以接受,或者是更好的解决方案?

非常感谢!

1 个答案:

答案 0 :(得分:1)

如果没有潜水,很难说你的具体情况。

我一般不喜欢xs:anyType和种类,因为它们过于通用。模式使用这些类型/元素放松了它们的结构目的。

我认为在你的情况下你只需要一些灵活的多态/ inhertitance构造。

您可以考虑以下选项:

  • xsi:type上使用DATA指定其确切的特定类型。这可以帮助您避免在某些环境中进行两阶段解析(在Java,JAXB中,对于instancs,优雅地处理xsi:type)。
  • 考虑使用substitutionGroups。您可以将DATA定义为抽象元素,然后可以通过不同的具体元素(单个DATA)替换。

请记住,XML Schema通常是定义交换协议的一种方式。所以使用像any这样的完全通用的结构基本上说“只是发给我一些东西”。如果不了解您的实施情况,就无法理解预期的结果。

对于内部使用案例,一切都很好,但内部事物经常上市,有时会在很短的时间内公布。