如何在解组之前了解架构

时间:2011-04-14 04:16:41

标签: java xml jaxb unmarshalling

情境:

我正在尝试重构代码,该代码要求用户选择一个xml文件,该文件假定遵守2个给定模式中的任何一个。现在,代码正在尝试使用Schema A Unmarshaller解组它。如果失败则尝试使用Schema B Unmarshaller解组它。如果两者都失败,则通过向用户显示正确的消息来拒绝该文件。

问题:

此处的程序流程取决于Exception抛出的unmarshal()

问题:

有没有办法知道我们应该尝试解析哪个unmarshaller文件,所以我们马上去找正确的unmarshaller?此外,这也有助于我们拒绝所有不相关的XML文件,这些文件不符合任何模式。

2 个答案:

答案 0 :(得分:1)

也许您应该考虑使用SAX解析器并在一个处理程序中手动处理这两个结构。另一种可能性是创建一个允许两个选项的新模式。

如果我完全控制了模式,我会看第二个选项。如果响应模式很简单和/或共享类似的结构,我会看看使用SAX。

答案 1 :(得分:1)

有几种不同的选择:

选项#1 - 在多域模型上创建JAXBContext

如果两个模式的模型兼容(完全独立,或以相同方式注释的共享类型),那么只需在所有域对象上创建JAXBContext,而不是每个模式都有一个。

选项#2 - StAX输入

如果使用不同的XML模式意味着拥有不同的根元素,我将创建一个StAX XMLStreamReader,查看根元素,然后选择要使用的编组器。然后解组那个XMLStreamReader。

选项#3 - 首先验证XML文档

您可以先使用javax.xml.validation API验证文档,然后根据结果选择unmarshaller。