Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在解组前了解模式_Java_Xml_Jaxb_Unmarshalling - Fatal编程技术网

Java 如何在解组前了解模式

Java 如何在解组前了解模式,java,xml,jaxb,unmarshalling,Java,Xml,Jaxb,Unmarshalling,场景: 我正在尝试重构一段代码,它要求用户选择一个xml文件,该文件假定遵循2个给定模式中的任何一个。现在,代码正在尝试使用Schema A解组器对其进行解组。如果失败,它将尝试使用Schema B Unmarshaller对其进行解组。如果两者都失败,则通过向用户显示正确的消息来拒绝该文件 问题: 在这里,程序流取决于unmarshal()引发的Exception 问题: 有没有办法知道我们应该通过哪个解组器来解析文件,所以我们马上就去寻找正确的解组器?此外,这还可以帮助我们拒绝所有不相关的X

场景:

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

问题:

在这里,程序流取决于
unmarshal()
引发的
Exception

问题:


有没有办法知道我们应该通过哪个
解组器来解析文件,所以我们马上就去寻找正确的解组器?此外,这还可以帮助我们拒绝所有不相关的XML文件,因为这些文件不符合任何一种模式。

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


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

有几个不同的选项:

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

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

选项#2-StAX输入

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

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


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

当然,我们可以像读取任何其他文件一样读取该文件,但我正在寻找更好的方法。谢谢您的建议。我会尝试第二种选择。如果这不起作用,即使这样,我相信我也能够使用SAX解析器,即使不能完全使用,但至少可以检查第一个元素+1+1事实上,我一直在等你,因为我知道你对XML解析器和JAXB掌握得很好。我会让你知道的。现在正在考虑是使用JAXB生成的类作为JTree的根节点,还是使用
DefaultMutableTreeNode
并将实际POJO作为
userObject
同时维护。再次感谢您的投入。