解析xml(当节点中有多个子节点)
概要:解析一个xml,当一个节点中又包含多个子节点如何解析,对比一个节点中不包括其他节点的情况。
一,xml样例
<cisReports batNo="查询批次号" unitName="查询单位名称" subOrgan="分支机构名称" queryUserID="查询操作员登录名" queryCount="查询请求数量" receiveTime="查询申请时间,格式YYYYMMDD HH24:mm:ss">
<!-- 以下为每个报告申请查得情况 1..n -->
<cisReport reportID="报告ID" buildEndTime="报告生成结束时间,格式YYYY-MM-DD HH24:mm:ss" queryReasonID="查询原因ID,详见数据字典" subReportTypes="查询的收费子报告ID,多个收费子报告ID用逗号分隔" treatResult="对应的收费子报告收费次数,与subReportTypes一一对应,为大于等于0的值的集合,用逗号分隔" subReportTypesShortCaption="报告查询类型" refID="引用ID,为查询申请条件中的引用ID" hasSystemError="有否系统错误,true:有错误,false:无错误" isFrozen="该客户是否被冻结,true:被冻结,false:未被冻结">
<!-- 个人基本信息 0..1 -->
<personBaseInfo subReportType="子报告ID" subReportTypeCost="收费子报告ID" treatResult="子报告查询状态,1:查得,2:未查得,3:其他原因未查得" treatErrorCode="treatResult=3时的错误代码,详见数据字典,treatResult!=3时,该属性不存在" errorMessage="treatResult=3时的错误描述信息,treatResult!=3时,该属性的值为空">
<!-- 内容节点,0..1 -->
<item>
<!-- 最新基本信息 1..1 -->
//lastBaseInfo节点中不包含其他节点
<lastBaseInfo>
<name>规范化后的姓名</name>
<gender>性别代码:1 男 2女 3 不详</gender>
<birthday>出生日期,格式YYYYMMDD</birthday>
<marriageStatus>婚姻状况ID</marriageStatus>
<registerAddress>规范化的户籍地址</registerAddress>
<currentAddress>规范化的现住址</currentAddress>
<tel>联系电话</tel>
<mobile>移动电话</mobile>
<occupationType>职业ID</occupationType>
<positionType>职务ID</positionType>
<titleType>职称ID</titleType>
<education>教育程度id</education>
<infoDate>信息获取日期,格式YYYYMMDD,可能为空。</infoDate>
</lastBaseInfo>
<!-- 身份警示信息 1..1 -->
//documentAlert节点中又包含多个item子节点
<documentAlert>
<!-- 0..n -->//代表可能包含多个item节点
<item>
<name>规范化后的姓名</name>
<documentNo>规范化后的证件号码</documentNo>
<documentType>证件类型ID,详见数据字典</documentType>
<country>证件签发地三位英文国际编码,详见数据字典</country>
<gender>性别ID,1:男,2:女,3:不详</gender>
<birthday>出生日期,格式YYYYMMDD</birthday>
<infoDate>信息获取日期,格式YYYYMMDD,可能为空。</infoDate>
</item>
</documentAlert>
</item>
</personBaseInfo>
二,代码
/**
* @return com.pingan.credit.model.py.ShenZhenPersonalCredit.PersonBaseInfo
* @Description: 2. 解析 个人基本信息
* @date 2017/10/9 17:11
*/
private PersonBaseInfo getPersonBaseInfoNode(Element cisReport) throws Exception {
// 获取节点属性
Element personBaseInfoElement = cisReport.element("personBaseInfo");
PersonBaseInfo personBaseInfo = null;
if (personBaseInfoElement != null) {
List<Attribute> personBaseInfoList = personBaseInfoElement.attributes(); Map<String, String> attributeMap = personBaseInfoList.stream()
.collect(Collectors.toMap(Attribute::getName, Attribute::getValue));
personBaseInfo = (PersonBaseInfo) CommonUtils.setValueOfSuperClass(PersonBaseInfo.class, attributeMap); //treatResult=1 表示查询状态 查得
if (SUCCESS.equals(attributeMap.get(TREAT_RESULT))) {
Element item = personBaseInfoElement.element("item");
if (item != null) {
//2 最新基本信息
//解析单个节点,不包含子节点
Element lastBaseElement = item.element("lastBaseInfo");
if (lastBaseElement != null) {
List<Element> lastBaseInfoList = item.element("lastBaseInfo").elements();
Map<String, String> lastBaseInfoListResultMap = XmlUtil.getResultMap(lastBaseInfoList);
LastBaseInfo lastBaseInfo = new LastBaseInfo();
personBaseInfo.setLastBaseInfo((LastBaseInfo) CommonUtils.setValue(lastBaseInfo, lastBaseInfoListResultMap));
} //6 身份警示信息
//节点中包含多个子节点
Element documentAlertElement = item.element("documentAlert");
if (documentAlertElement != null) {
List<Element> documentAlertList = item.element("documentAlert").elements();
if (!ListUtil.isEmpty(documentAlertList)) {
List<DocumentAlert> itemList = new ArrayList<>();
//遍历子节点,获取每个子节点中节点内容
for (Element e : documentAlertList) {
DocumentAlert documentAlert = new DocumentAlert();
documentAlert = (DocumentAlert) CommonUtils.setValue(documentAlert, XmlUtil.getResultMap(e.elements()));
itemList.add(documentAlert);
}
personBaseInfo.setDocumentAlerts(itemList);
}
} } }
}
return personBaseInfo;
}
解析节点反射赋值
/**
* 将元素节点转换成map
*/
public static Map<String, String> getResultMap(List<Element> items) {
Map<String, String> map = new HashMap<>(32);
for (Element e : items) {
if (StringUtils.isNotEmpty(e.getData().toString())) {
map.put(e.getName(), e.getData().toString());
}
}
return map;
}
/**
* @param object, resultMap
* @return java.lang.Object
* @Description: 通过反射为实体类赋值
* @date 2017/8/30 9:43
*/
public static Object setValue(Object object, Map<String, String> resultMap) throws Exception {
try {
Class<?> obj = object.getClass();
Field[] fields = obj.getDeclaredFields();
setValue(object, resultMap, fields); return object;
} catch (IllegalAccessException e) {
logger.info("IllegalAccessException@CommonUtils:" + e.getMessage());
throw e;
} catch (Exception e) {
logger.info("Exception@CommonUtils:" + e.getMessage());
throw e;
}
}
解析xml(当节点中有多个子节点)的更多相关文章
- 解析xml文件 selectSingleNode取不到节点
今天在做批量生成XML的时候,碰到一个情况 解析xml文件 selectSingleNode一直返回NULL. XML的格式开头有一句这个<CE401Message xmlns="ht ...
- soap发送报文请求和dom4j解析XML并且获得指定名称的节点信息
package com.lzw.b2b.soap; import java.io.ByteArrayInputStream;import java.io.InputStream;import java ...
- 学习XML(添加一个子节点) 摘录
这里介绍添加XML节点的方法. 首先定义XML文件:(bookstore.xml) <?xml version="1.0" encoding="utf-8" ...
- java实战之解析xml
在java中解析xml有现成的包提供方法,常用的有四类:Dom,JDom,Sax以及Dom4j.其中前者是java中自带的,后三者需要大家从开源诸如sourceforge这样的网站下载jar包,然后在 ...
- XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
本文主要涉及:xml概念描述,xml的约束文件,dtd,xsd文件的定义使用,如何在xml中引用xsd文件,如何使用java解析xml,解析xml方式dom sax,dom4j解析xml文件 XML来 ...
- XML基础+Java解析XML +几种解析方式的性能比较
XML基础+Java解析XML 一:XML基础 XML是什么: 可扩展的标记语言 XML能干什么: 描述数据.存储数据.传输(交换)数据. XML与HTML区别: 目的不一样 XML 被设计用来描述数 ...
- XML:使用DOM技术解析xML文件中的城市,实现select级联选择
中国的城市xml格式:cities.xml <?xml version="1.0" encoding="utf-8"?> <china> ...
- pull 解析XML 文件
pull解析的特点 事件驱动机制来解析 当解析到一个节点,会自动停止,不会往下继续解析,好处 :很好能够控制流程 android默认采用pull解析 pull解析的事件类型 start_documen ...
- java解析xml
一.Document对象相关 1.读取XML文件,获得document对象. SAXReader reader = new SAXReader(); ...
随机推荐
- drawable转mitmap 以及图片base64编码
static Bitmap drawableToBitmap(Drawable drawable) // drawable 转换成bitmap { int width = drawable.getIn ...
- MySQL和MSSQL差异(增量)备份的原理
MySQL和MSSQL差异(增量)备份的原理 对于真正的增量备份来说,只需要记录当前每页最后的检查点的LSN,如果大于之前全备时的LSN,则备份该页面,否则不用备份 这大大加快了备份速度和恢复时间,同 ...
- hashset和treeset的区别
hashset 和 treeset的区别 hashset 和 treeset的区别 1.TreeSet 是二差树实现的,Treeset中的数据是自动排好序的,不允许放入null值. 2.HashSet ...
- 141. Linked List Cycle(判断链表是否有环)
141. Linked List Cycle Given a linked list, determine if it has a cycle in it. Follow up:Can you sol ...
- Vim简明教程【CoolShell】(转)
m的学习曲线相当的大(参看各种文本编辑器的学习曲线),所以,如果你一开始看到的是一大堆VIM的命令分类,你一定会对这个编辑器失去兴趣的.下面的文章翻译自<Learn Vim Progressiv ...
- wkhtmtopdf--高分辨率HTML转PDF(三)
代码篇 浏览了很多实例,总找不到既能把HTML保存为PDF,同时实现流抛出的,所以自己琢磨了许久,终于实现了这样两个需求的结合体,下面来贡献一下吧~~ 下面我们来选择一个网页打印下,保存为PDF,而且 ...
- 转载:使用 OpenCV 识别 QRCode
原文链接:http://coolshell.cn/articles/10590.html#jtss-tsina 识别二维码的项目数不胜数,每次都是开箱即用,方便得很. 这次想用 OpenCV 从零识别 ...
- 20145314郑凯杰《网络对抗技术》实验5 MSF基础应用
20145314郑凯杰<网络对抗技术>实验5 MSF基础应用 1.0 MS08_067安全漏洞 1.1 实验目标 了解掌握metasploit平台的一些基本操作,能学会利用已知信息完成简单 ...
- linux及安全第七周总结——20135227黄晓妍
实验部分 首先clone最新的menu 我们可以看到,test.c里多了一个exec的功能,它的代码和fork基本一致,多了一项加载hello rootfs也有一些变化 执行一下exec 让我们启动一 ...
- POJ 1014 Dividing(多重背包+二进制优化)
http://poj.org/problem?id=1014 题意:6个物品,每个物品都有其价值和数量,判断是否能价值平分. 思路: 多重背包.利用二进制来转化成0-1背包求解. #include&l ...