JAXB解析xml到实体类

解析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();
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小安灬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值