1

设想:

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

问题:

这里的程序流程取决于Exceptionthrow by unmarshal()

问题:

有没有办法知道unmarshaller我们应该尝试解析文件,所以我们马上去寻找正确的解组器?此外,这还有助于我们拒绝所有不符合任一模式的无关 XML 文件。

4

2 回答 2

1

有几个不同的选项:

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

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

选项 #2 - StAX 输入

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

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

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

于 2011-04-14T09:39:18.280 回答
1

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

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

于 2011-04-14T05:31:38.803 回答