解析xml到java实体类
xml
<Document>
<PRH>
<PA01>
<PA01A>
<PA01AI01>2019112716295473566552</PA01AI01>
<PA01AR01>2019-11-27T16:29:54</PA01AR01>
</PA01A>
</PA01>
</PRH>
</Document>
实体类
import javax.xml.bind.annotation.XmlRootElement;
import lombok.*;
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@XmlRootElement(name = "Document")
public class ReportMessageV2 implements Serializable{
private PRH PRH;
}
解析类,将xml解析成实体类
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
public class BizAnalyUtil {
private static JAXBContext context = null;
static {
try {
context = JAXBContext.newInstance(ReportMessageV2.class);
} catch (JAXBException e) {}
}
public static ReportMessageV2 analy(String reqId, String msg) throws AnalyException{
ReportMessageV2 reportMessageV2= null;
try {
Unmarshaller unmarshaller = context.createUnmarshaller();
reportMessageV2= (ReportMessageV2) unmarshaller.unmarshal(new StringReader(msg));
return reportMessageV2;
}catch (Exception e) {}
}
}
==========================================
解决xml映射到实体类,首字母大写问题
xml
<ReportMessage>
<HEADER>
<MessageHeader>
<ReportSN>2019090500008323530615</ReportSN>
<QueryTime>2019-09-05 21:50:35</QueryTime>
</MessageHeader>
</HEADER>
</ReportMessage>
java实体类
@Getter
@Setter
@ToString
@NoArgsConstructor
@AllArgsConstructor
@XmlRootElement(name = "reportMessage")
public class ReportMessageV1 implements Serializable {
private Header Header;
}
解析类
public class BizAnalyV1Util {
private static JAXBContext context;
private static XMLInputFactory xif;
static {
try {
context = JAXBContext.newInstance(ReportMessageV1.class);
xif = XMLInputFactory.newInstance();
} catch (JAXBException e) {
throw new RuntimeException(e);
}
}
public static ReportMessageV1 analy(String reqId, String msg) throws AnalyException {
long start = System.currentTimeMillis();
try {
XMLStreamReader xsr = xif.createXMLStreamReader(new StringReader(msg));
// 使用自定义的MyStreamReaderDelegate,修改节点名称
xsr = new MyStreamReaderDelegate(xsr);
Unmarshaller unmarshaller = context.createUnmarshaller();
ReportMessageV1 reportMessageV1 = (ReportMessageV1) unmarshaller.unmarshal(xsr);
return reportMessageV1;
} catch (Exception e) {
throw new AnalyException("报文解析异常" + reqId + " : " + e);
}
}
// 自定义StreamReaderDelegate,将节点的首字母改为小写再进行映射到实体类
private static class MyStreamReaderDelegate extends StreamReaderDelegate {
MyStreamReaderDelegate(XMLStreamReader xsr) {
super(xsr);
}
@Override
public String getAttributeLocalName(int index) {
// 将节点的首字母改为小写,改后要使用intern()
return CommonUtils.toLowerCaseFirstOne(super.getAttributeLocalName(index).intern());
}
@Override
public String getLocalName() {
// 将节点的首字母改为小写,改后要使用intern()
return CommonUtils.toLowerCaseFirstOne(super.getLocalName()).intern();
}
}
}