Java 如何根据接收到的XML对不同对象进行解组?

Java 如何根据接收到的XML对不同对象进行解组?,java,xml,web-services,jaxb,Java,Xml,Web Services,Jaxb,我有一个web服务,它接收XML文件并进行解组以将XML文件转换为对象。问题是我的web服务可以接收不同的XML结构,并且必须进行正确的解组 所以我收到了这种XML文件: <root> <user> <id>1234</id> </user> <XMLelements> ... </XMLelements> </root> 1234

我有一个web服务,它接收XML文件并进行解组以将XML文件转换为对象。问题是我的web服务可以接收不同的XML结构,并且必须进行正确的解组

所以我收到了这种XML文件:

<root>
    <user>
        <id>1234</id>
    </user>
    <XMLelements>
        ...
    </XMLelements>
</root>

1234
...
请注意,
XMLelements
是一个示例标记名,每个XML文件可能有不同的名称

因此,我认为,我的web服务工作流应该类似于:

  • 它接收XML文件
  • 它检查用户id。
    • 如果用户id==1234
      • UserA UserA=unmarshalling(XMLFile)
    • 否则,如果用户id==5678
      • UserB UserB=unmarshalling(XMLFile)
    • 否则
      • UserC UserC=unmarshalling(XMLFile)
  • 因此,我接收不同的XML结构,对于每一个结构,我必须进行不同的解组以获得不同类的对象

    如何执行此方法?我正在使用Spring进行编组(地铁)

    编辑:这个问题没有得到任何答案,可能我不清楚。我将尝试更好地解释:


    我有一个web服务,它正在侦听接收XML文件的url。实际上,在同一url路径中,我的web服务接收两个不同的XML模式。我如何知道如何正确进行解组?我的意思是,当传递不同的XML模式时,解组应该返回正确的对象。

    有两种不同的方法来支持此用例


    选项#1-DOM方法

    您可以始终使用DOM解析器将XML转换为
    文档
    对其执行XPath以获取
    id
    元素的值,然后根据结果对文档进行解组


    选项#2-SAX方法

    lookaheadumarshallerhandler

    您可以利用SAX解析器和JAXB的
    解组器handler
    机制,并执行以下操作:

    • 创建一个
      ContentHandler
      ,将SAX事件排队,直到发现必要的信息
    • 基于
      id
      元素的值创建/检索
      JAXBContext
    • JAXBContext
      创建一个
      UnmarshallerHandler
    • 调用
      解组处理器上的排队事件
    • XMLReader
      上的
      UnmarshallerHandler
      设置为
      ContentHandler
    • 解组处理器
      中检索解组对象
    UM13397834的包;
    导入java.util.*;
    导入javax.xml.bind.*;
    导入org.xml.sax.*;
    导入org.xml.sax.helpers.DefaultHandler;
    公共类LookAheadUnmarshallerHandler扩展了DefaultHandler{
    私有XMLReader;
    私有列表事件=新的ArrayList();
    私人拆包商拆包商;
    公共外观引导器(XMLReader XMLReader){
    this.xmlReader=xmlReader;
    }
    @凌驾
    public void startElement(字符串uri、字符串localName、字符串qName、,
    属性)引发SAX异常{
    添加(新的StartElement(uri、localName、qName、属性));
    }
    @凌驾
    公共void endElement(字符串uri、字符串localName、字符串qName)
    抛出SAX异常{
    if(“id”.equals(localName)| |“id”.equals(qName)){
    Characters Characters=(Characters)events.get(events.size()-1);
    字符串值=个字符。getString();
    jaxbcontextjc;
    试一试{
    如果(“1234”。等于(值)){
    jc=JAXBContext.newInstance(Root1.class);
    }否则,如果(“5678”。等于(值)){
    jc=JAXBContext.newInstance(Root2.class);
    }否则{
    jc=JAXBContext.newInstance(Root3.class);
    }
    unmarshallerHandler=jc.createUnmarshaller().getUnmarshallerHandler();
    }捕获(JAXBEException e){
    抛出新的运行时异常(e);
    }
    unmarshallerHandler.startDocument();
    对于(事件:事件){
    event.event(unmarshallerHandler);
    }
    endElement(uri、localName、qName);
    setContentHandler(unmarshallerHandler);
    }否则{
    添加(新的EndElement(uri、localName、qName));
    }
    }
    @凌驾
    公共无效字符(字符[]ch,整数开始,整数长度)
    抛出SAX异常{
    添加(新字符(ch、start、length));
    }
    公共对象getResult()抛出JAXBEException{
    返回unmarshallerHandler.getResult();
    }
    私有静态抽象类事件{
    公共抽象无效事件(ContentHandler ContentHandler)引发SAXException;
    }
    私有静态类StartElement扩展事件{
    私有字符串uri;
    私有字符串localName;
    私有字符串qName;
    私人属性;
    公共StartElement(字符串uri、字符串localName、字符串qName、属性){
    this.uri=uri;
    this.localName=localName;
    this.qName=qName;
    this.attributes=属性;
    }
    @凌驾
    公共无效事件(ContentHandler ContentHandler)引发SAXException{
    startElement(uri、localName、qName、属性);
    }
    }
    私有静态类字符扩展事件{
    私有字符[]ch;
    私人int启动;
    私有整数长度;
    公共字符(字符[]ch,整数开始,整数长度){
    this.ch=ch;
    this.start=start;
    这个长度=长度;
    }
    @凌驾
    公共无效事件(ContentHandl)
    
    <root>
        <user>
            <id>1234</id>
        </user>
        <XMLelements>
            ...
        </XMLelements>
    </root>
    
    class forum13397834.UserA