情境:
我正在尝试重构代码,该代码要求用户选择一个xml文件,该文件假定遵守2个给定模式中的任何一个。现在,代码正在尝试使用Schema A Unmarshaller
解组它。如果失败则尝试使用Schema B Unmarshaller
解组它。如果两者都失败,则通过向用户显示正确的消息来拒绝该文件。
问题:
此处的程序流程取决于Exception
抛出的unmarshal()
。
问题:
有没有办法知道我们应该尝试解析哪个unmarshaller
文件,所以我们马上去找正确的unmarshaller?此外,这也有助于我们拒绝所有不相关的XML文件,这些文件不符合任何模式。
答案 0 :(得分:1)
也许您应该考虑使用SAX解析器并在一个处理程序中手动处理这两个结构。另一种可能性是创建一个允许两个选项的新模式。
如果我完全控制了模式,我会看第二个选项。如果响应模式很简单和/或共享类似的结构,我会看看使用SAX。
答案 1 :(得分:1)
有几种不同的选择:
选项#1 - 在多域模型上创建JAXBContext
如果两个模式的模型兼容(完全独立,或以相同方式注释的共享类型),那么只需在所有域对象上创建JAXBContext,而不是每个模式都有一个。
选项#2 - StAX输入
如果使用不同的XML模式意味着拥有不同的根元素,我将创建一个StAX XMLStreamReader,查看根元素,然后选择要使用的编组器。然后解组那个XMLStreamReader。
选项#3 - 首先验证XML文档
您可以先使用javax.xml.validation API验证文档,然后根据结果选择unmarshaller。