Java 如何根据接收到的XML对不同对象进行解组?
我有一个web服务,它接收XML文件并进行解组以将XML文件转换为对象。问题是我的web服务可以接收不同的XML结构,并且必须进行正确的解组 所以我收到了这种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
<root>
<user>
<id>1234</id>
</user>
<XMLelements>
...
</XMLelements>
</root>
1234
...
请注意,XMLelements
是一个示例标记名,每个XML文件可能有不同的名称
因此,我认为,我的web服务工作流应该类似于:
- 如果用户id==1234
- UserA UserA=unmarshalling(XMLFile)
- 否则,如果用户id==5678
- UserB UserB=unmarshalling(XMLFile)
- 否则
- UserC UserC=unmarshalling(XMLFile)
我有一个web服务,它正在侦听接收XML文件的url。实际上,在同一url路径中,我的web服务接收两个不同的XML模式。我如何知道如何正确进行解组?我的意思是,当传递不同的XML模式时,解组应该返回正确的对象。有两种不同的方法来支持此用例
选项#1-DOM方法 您可以始终使用DOM解析器将XML转换为
文档
对其执行XPath以获取id
元素的值,然后根据结果对文档进行解组
选项#2-SAX方法 lookaheadumarshallerhandler 您可以利用SAX解析器和JAXB的
解组器handler
机制,并执行以下操作:
- 创建一个
,将SAX事件排队,直到发现必要的信息ContentHandler
- 基于
元素的值创建/检索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