Java 确定基于XML文件的类型以指定相应的处理程序

Java 确定基于XML文件的类型以指定相应的处理程序,java,xml,jaxb,deserialization,Java,Xml,Jaxb,Deserialization,我有一个ScheduledJob,它每xx秒检查一个配置好的文件夹,查找新的XML文件。由于每个XML文件的内容不同,我需要确定应该使用哪个处理程序对特定的XML文件进行反序列化,并进行进一步的处理 据我所知,使用JAXB对XML进行解组/反序列化很容易,但要做到这一点,您需要指定XML文件的相应类。在本例中,我需要根据XML文件所属的类/POJO选择正确的处理程序 例如,如下所示: 相应的处理程序处理XML文件的特定类型/类 List<File> xmlFiles = Arrays

我有一个ScheduledJob,它每xx秒检查一个配置好的文件夹,查找新的XML文件。由于每个XML文件的内容不同,我需要确定应该使用哪个处理程序对特定的XML文件进行反序列化,并进行进一步的处理

据我所知,使用JAXB对XML进行解组/反序列化很容易,但要做到这一点,您需要指定XML文件的相应类。在本例中,我需要根据XML文件所属的类/POJO选择正确的处理程序

例如,如下所示: 相应的处理程序处理XML文件的特定类型/类

List<File> xmlFiles = Arrays.asList(xmlFilesDirectory.listFiles(((dir, name) -> {return name.toLowerCase().endsWith(".xml");})));

for(File xmlFile : xmlFiles)
{
    // Load XML 
    // decide which class / object to unmarshal to.


    switch (xmlClassType) {
        case TypeA:
            abstractXmlHandler = typeAXmlHandler;
            break;
        case TypeB:
            abstractXmlHandler = typeBXmlHandler;
            break;
        case TypeC:
            abstractXmlHandler = typeCXmlHandler;
            break;
        default:
            throw new UnsupportedOperationException("Unknown type");
    }

abstractXmlHandler.handle(xmlFile)

}
但要做到这一点,您需要指定XML文件的相应类

不对。您可以使用上下文路径创建JAXB上下文,例如:

JAXBContext.newInstance("com.acme.foo:com.acme:bar");
上下文路径是一个或多个程序包名称,以:


使用此方法,您不需要指定确切的类,您可以一次指定所有可能的包。

最简单的方法是文件名约定。如果不可能,您可以使用SAX或StAX解析器解析第一个元素以确定正确的处理程序。。。我将看一看SAX或StAX。如果这样做,如何确定输出对象。到目前为止,解组的过程如下:解组器jaxbUnmarshaller=jaxbContext.createUnmarshaller;MyClass MyClass=MyClass jaxbUnmarshaller.unmarshalxmlFile;在本例中,我必须指定目标类。如果我使用上下文路径添加所有类,我如何知道目标?在编译时,您无法知道目标。您通常会得到一个JAXBElement实例,该实例将包含value及其类。您可以使用这些来选择处理程序。不幸的是,这不起作用。my.package不包含ObjectFactory.class或jaxb.index。应该说使用弹簧和梯度。搜索此错误可以找到许多解决方案,但到目前为止没有一个有效。为什么Java必须比Java复杂得多C@bananajoe这是可行的,但您确实需要ObjectFactory或jaxb.index。index是最简单的,只需从其中的包中枚举所有相关类即可。@bananajoe。对已解组的内容使用JAXBIntrospector.getValue以获取值。在某些情况下,您会得到一个封装实际值的JAXBElement实例。