【问题标题】:How to Know Schema Before Unmarshalling如何在解组之前了解 Schema
【发布时间】:2011-04-14 04:16:41
【问题描述】:

场景:

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

问题:

这里的程序流程依赖于unmarshal()抛出的Exception

问题:

有什么方法可以知道我们应该使用哪个unmarshaller 来解析文件,所以我们马上去找正确的解组器?此外,这还有助于我们拒绝所有不符合任一模式的无关 XML 文件。

【问题讨论】:

  • 当然,我们可以像读取任何其他文件一样读取文件,但我正在寻找更好的方法。

标签: java xml jaxb unmarshalling


【解决方案1】:

有几个不同的选项:

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

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

选项 #2 - StAX 输入

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

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

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

【讨论】:

  • +1 你知道,实际上,我一直在等你,因为我知道你对 XML 解析器和 JAXB 有很好的掌握。会让你知道的。现在正在考虑是使用 JAXB 生成的类作为 JTree 的根节点,还是使用 DefaultMutableTreeNode 并同时维护实际的 POJO 作为 userObject
  • 使用第二个选项。再次感谢您的投入。
【解决方案2】:

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

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

【讨论】:

  • 感谢您的建议。我会尝试第二种选择。如果这不起作用,即使那样我相信我也可以使用 SAX 解析器,如果不是完全但至少可以检查第一个元素。 +1
猜你喜欢
  • 2020-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-20
  • 2015-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多