XML文件的解析总结
xml的传输在程序就开发中开始很常见的,在网上看了其他人的总结,总感觉不是那么的傻瓜,
给别人看了总是感觉云里雾里,正好最近项目涉及到XML的解析,那么我就用实际的例子来
总结一下XML的解析。
首先建一个PO类,来存储节点的值,也方便以后数据的存取
可能你觉得这PO类是不是多余了,开始我也这么认为,后来
我发现真的很好用,当然有的时候没有用。
public class FormDatePo {
private String BeanName;
private String BeanDisplay;
public String getBeanName() {
return BeanName;
}
public void setBeanName(String beanName) {
BeanName = beanName;
}
public String getBeanDisplay() {
return BeanDisplay;
}
public void setBeanDisplay(String beanDisplay) {
BeanDisplay = beanDisplay;
}
@Override
public String toString() {
return "FormDatePo [BeanName=" + BeanName + ", BeanDisplay="
+ BeanDisplay + "]";
}
}
<formExport version="2.0">
<summary id="-3372874932431861319" name="formmain_3988"/>
<definitions>
<column id="field0001" type="0" name="项目公司" length="255"/>
<column id="field0002" type="0" name="项目名称" length="255"/>
<column id="field0003" type="0" name="经办人" length="255"/>
<column id="field0004" type="0" name="经办部门" length="255"/>
<column id="field0015" type="0" name="NC系统中项目公司名称" length="255"/>
<column id="field0016" type="0" name="OA项目公司对应审批人" length="255"/>
<column id="field0017" type="0" name="OA系统中项目公司名称" length="255"/>
<column id="field0018" type="0" name="NC系统中项目公司编码" length="255"/>
<column id="field0019" type="0" name="OA系统中项目公司编码" length="255"/>
</definitions>
<values>
<column name="项目公司">
<value><![CDATA[地产开发有限公司]]></value>
</column>
<column name="项目名称">
<value><![CDATA[赏心小筑创意办公]]></value>
</column>
<column name="经办人">
<value><![CDATA[王]]></value>
</column>
<column name="经办部门">
<value><![CDATA[客服部]]></value>
</column>
<column name="NC系统中项目公司名称">
<value/>
</column>
<column name="OA项目公司对应审批人">
<value/>
</column>
<column name="OA系统中项目公司名称">
<value/>
</column>
<column name="NC系统中项目公司编码">
<value><![CDATA[138029]]></value>
</column>
<column name="OA系统中项目公司编码">
<value/>
</column>
</values>
<subForms>
<subForm>
<definitions>
<column id="field0005" type="0" name="序号" length="255"/>
<column id="field0006" type="0" name="客户" length="255"/>
<column id="field0007" type="0" name="房产名称" length="255"/>
<column id="field0008" type="0" name="房产所属楼栋" length="255"/>
<column id="field0009" type="0" name="留房开始日" length="255"/>
<column id="field0010" type="0" name="留房到期日" length="255"/>
<column id="field0011" type="0" name="留房价格" length="255"/>
<column id="field0012" type="0" name="留房类型" length="255"/>
<column id="field0013" type="0" name="留房原因" length="255"/>
<column id="field0014" type="0" name="附件" length="255"/>
<column id="field0005" type="0" name="序号" length="255"/>
<column id="field0006" type="0" name="客户" length="255"/>
<column id="field0007" type="0" name="房产名称" length="255"/>
<column id="field0008" type="0" name="房产所属楼栋" length="255"/>
<column id="field0009" type="0" name="留房开始日" length="255"/>
<column id="field0010" type="0" name="留房到期日" length="255"/>
<column id="field0011" type="0" name="留房价格" length="255"/>
<column id="field0012" type="0" name="留房类型" length="255"/>
<column id="field0013" type="0" name="留房原因" length="255"/>
<column id="field0014" type="0" name="附件" length="255"/>
</definitions>
<values>
<row>
<column name="序号">
<value><![CDATA[1]]></value>
</column>
<column name="客户">
<value><![CDATA[边]]></value>
</column>
<column name="房产名称">
<value><![CDATA[赏心小筑创意办公SOHO10#地下室B2-01]]></value>
</column>
<column name="房产所属楼栋">
<value><![CDATA[SOHO10#地下室]]></value>
</column>
<column name="留房开始日">
<value><![CDATA[2017-05-06]]></value>
</column>
<column name="留房到期日">
<value><![CDATA[2017-06-06]]></value>
</column>
<column name="留房价格">
<value><![CDATA[17120.00]]></value>
</column>
<column name="留房类型">
<value><![CDATA[首次留房]]></value>
</column>
<column name="留房原因">
<value><![CDATA[556]]></value>
</column>
<column name="附件">
<value><![CDATA[2173532149|206960|400]]></value>
</column>
</row>
<row>
<column name="序号">
<value><![CDATA[2]]></value>
</column>
<column name="客户">
<value><![CDATA[金]]></value>
</column>
<column name="房产名称">
<value><![CDATA[赏心小筑创意办公SOHO10#地下室B2-02]]></value>
</column>
<column name="房产所属楼栋">
<value><![CDATA[SOHO10#地下室]]></value>
</column>
<column name="留房开始日">
<value><![CDATA[2017-05-06]]></value>
</column>
<column name="留房到期日">
<value><![CDATA[2017-06-06]]></value>
</column>
<column name="留房价格">
<value><![CDATA[18880.00]]></value>
</column>
<column name="留房类型">
<value><![CDATA[首次留房]]></value>
</column>
<column name="留房原因">
<value><![CDATA[15]]></value>
</column>
<column name="附件">
<value><![CDATA[-6323048332690438990]]></value>
</column>
</row>
</values>
</subForm>
</subForms>
</formExport>
这里是一个复杂的XML文件需要传输,同时也需要对其中的数据进行分析,甚至是替换新的数据
//解析xml
//这里的xml文件先用流的方式输入到程序内
data = 用流的方式输出到程序
//下面的方法我返回值设置成集合方便,在程序中存取
public static List<FormDatePo> getValues(String data){
try {
//解析xml
List<FormDatePo> rowlist = new ArrayList<FormDatePo>();
Document doc = DocumentHelper.parseText(data);
Element rootElt = doc.getRootElement(); // 获取根节点
//解析重复表subForms
Iterator iterSubForms = rootElt.elementIterator("subForms");
int index = 0;
while(iterSubForms.hasNext()){
Element applicantSubForms = (Element)iterSubForms.next();
Iterator iterSubForm = applicantSubForms.elementIterator("subForm");
// 对每个重复表进行遍历
while(iterSubForm.hasNext()){
index++;
Element applicantSubForm = (Element)iterSubForm.next();
Iterator iterSubVa = applicantSubForm.elementIterator("values");
while(iterSubVa.hasNext()){
Element applicantSubVa = (Element)iterSubVa.next();
Iterator iterRowsVa = applicantSubVa.elementIterator("row");
while(iterRowsVa.hasNext()){
// 创建list保存每行重复表信息
Element applicantRowsVa = (Element)iterRowsVa.next();
Iterator iterRowCol = applicantRowsVa.elementIterator("column");
while(iterRowCol.hasNext()){
FormDatePo formDate = new FormDatePo();
Element applicantColVa = (Element)iterRowCol.next();
formDate.setBeanName(applicantColVa.attributeValue("name"));
Iterator iterRowColVa = applicantColVa.elementIterator("value");
while(iterRowColVa.hasNext()){
Element applicantRowColVa = (Element)iterRowColVa.next();
//通过这个方法可以通过遍历xml各节点然后获取相应节点的数值,存到
PO中,并且放到集合里面
//如果想要改变对应节点的值可以用这个方法
//
if(applicantColVa.attributeValue("name").equals("附件")){
formDate.setBeanDisplay(applicantRowColVa.getText());
rowlist.add(formDate);
//这里是修改值的方法
applicantRowColVa.setText(attStr);
}
}
}
}
}
}
}
return rowlist;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
需要哪个节点下的数据,就从哪个标签开始迭代。很方便,对应的节点也能根据节点的特征类修改
这里加入rowlist中的数据需要处理的话也能取出来处理
可以看到附件这里的值是几个附件的id用“|”分开的,这里处理一下
,我是放到数组里面
for (int i = 0; i < fileList.size(); i++) {
String tmp = fileList.get(i).getBeanDisplay();
Long subId = Long.valueOf(fileIdList.get(i).getBeanDisplay());
long[] a = new long[5];
String spliter = null;
int ind = -1;
while(tmp.contains("|")){
ind++;
int j = tmp.indexOf("|");
spliter = tmp.substring(0,j);
a[ind] = Long.valueOf(spliter);
tmp = tmp.substring(j+1);
}
a[ind+1] =Long.valueOf(tmp);
}
考虑到附件的数量不会太多,这里把数组长度设置为5,当然
数组可能元素不满,再取出的时候要做非空判断。做好必要的处理
xml的传输在程序就开发中开始很常见的,在网上看了其他人的总结,总感觉不是那么的傻瓜,
给别人看了总是感觉云里雾里,正好最近项目涉及到XML的解析,那么我就用实际的例子来
总结一下XML的解析。
首先建一个PO类,来存储节点的值,也方便以后数据的存取
可能你觉得这PO类是不是多余了,开始我也这么认为,后来
我发现真的很好用,当然有的时候没有用。
public class FormDatePo {
private String BeanName;
private String BeanDisplay;
public String getBeanName() {
return BeanName;
}
public void setBeanName(String beanName) {
BeanName = beanName;
}
public String getBeanDisplay() {
return BeanDisplay;
}
public void setBeanDisplay(String beanDisplay) {
BeanDisplay = beanDisplay;
}
@Override
public String toString() {
return "FormDatePo [BeanName=" + BeanName + ", BeanDisplay="
+ BeanDisplay + "]";
}
}
<formExport version="2.0">
<summary id="-3372874932431861319" name="formmain_3988"/>
<definitions>
<column id="field0001" type="0" name="项目公司" length="255"/>
<column id="field0002" type="0" name="项目名称" length="255"/>
<column id="field0003" type="0" name="经办人" length="255"/>
<column id="field0004" type="0" name="经办部门" length="255"/>
<column id="field0015" type="0" name="NC系统中项目公司名称" length="255"/>
<column id="field0016" type="0" name="OA项目公司对应审批人" length="255"/>
<column id="field0017" type="0" name="OA系统中项目公司名称" length="255"/>
<column id="field0018" type="0" name="NC系统中项目公司编码" length="255"/>
<column id="field0019" type="0" name="OA系统中项目公司编码" length="255"/>
</definitions>
<values>
<column name="项目公司">
<value><![CDATA[地产开发有限公司]]></value>
</column>
<column name="项目名称">
<value><![CDATA[赏心小筑创意办公]]></value>
</column>
<column name="经办人">
<value><![CDATA[王]]></value>
</column>
<column name="经办部门">
<value><![CDATA[客服部]]></value>
</column>
<column name="NC系统中项目公司名称">
<value/>
</column>
<column name="OA项目公司对应审批人">
<value/>
</column>
<column name="OA系统中项目公司名称">
<value/>
</column>
<column name="NC系统中项目公司编码">
<value><![CDATA[138029]]></value>
</column>
<column name="OA系统中项目公司编码">
<value/>
</column>
</values>
<subForms>
<subForm>
<definitions>
<column id="field0005" type="0" name="序号" length="255"/>
<column id="field0006" type="0" name="客户" length="255"/>
<column id="field0007" type="0" name="房产名称" length="255"/>
<column id="field0008" type="0" name="房产所属楼栋" length="255"/>
<column id="field0009" type="0" name="留房开始日" length="255"/>
<column id="field0010" type="0" name="留房到期日" length="255"/>
<column id="field0011" type="0" name="留房价格" length="255"/>
<column id="field0012" type="0" name="留房类型" length="255"/>
<column id="field0013" type="0" name="留房原因" length="255"/>
<column id="field0014" type="0" name="附件" length="255"/>
<column id="field0005" type="0" name="序号" length="255"/>
<column id="field0006" type="0" name="客户" length="255"/>
<column id="field0007" type="0" name="房产名称" length="255"/>
<column id="field0008" type="0" name="房产所属楼栋" length="255"/>
<column id="field0009" type="0" name="留房开始日" length="255"/>
<column id="field0010" type="0" name="留房到期日" length="255"/>
<column id="field0011" type="0" name="留房价格" length="255"/>
<column id="field0012" type="0" name="留房类型" length="255"/>
<column id="field0013" type="0" name="留房原因" length="255"/>
<column id="field0014" type="0" name="附件" length="255"/>
</definitions>
<values>
<row>
<column name="序号">
<value><![CDATA[1]]></value>
</column>
<column name="客户">
<value><![CDATA[边]]></value>
</column>
<column name="房产名称">
<value><![CDATA[赏心小筑创意办公SOHO10#地下室B2-01]]></value>
</column>
<column name="房产所属楼栋">
<value><![CDATA[SOHO10#地下室]]></value>
</column>
<column name="留房开始日">
<value><![CDATA[2017-05-06]]></value>
</column>
<column name="留房到期日">
<value><![CDATA[2017-06-06]]></value>
</column>
<column name="留房价格">
<value><![CDATA[17120.00]]></value>
</column>
<column name="留房类型">
<value><![CDATA[首次留房]]></value>
</column>
<column name="留房原因">
<value><![CDATA[556]]></value>
</column>
<column name="附件">
<value><![CDATA[2173532149|206960|400]]></value>
</column>
</row>
<row>
<column name="序号">
<value><![CDATA[2]]></value>
</column>
<column name="客户">
<value><![CDATA[金]]></value>
</column>
<column name="房产名称">
<value><![CDATA[赏心小筑创意办公SOHO10#地下室B2-02]]></value>
</column>
<column name="房产所属楼栋">
<value><![CDATA[SOHO10#地下室]]></value>
</column>
<column name="留房开始日">
<value><![CDATA[2017-05-06]]></value>
</column>
<column name="留房到期日">
<value><![CDATA[2017-06-06]]></value>
</column>
<column name="留房价格">
<value><![CDATA[18880.00]]></value>
</column>
<column name="留房类型">
<value><![CDATA[首次留房]]></value>
</column>
<column name="留房原因">
<value><![CDATA[15]]></value>
</column>
<column name="附件">
<value><![CDATA[-6323048332690438990]]></value>
</column>
</row>
</values>
</subForm>
</subForms>
</formExport>
这里是一个复杂的XML文件需要传输,同时也需要对其中的数据进行分析,甚至是替换新的数据
//解析xml
//这里的xml文件先用流的方式输入到程序内
data = 用流的方式输出到程序
//下面的方法我返回值设置成集合方便,在程序中存取
public static List<FormDatePo> getValues(String data){
try {
//解析xml
List<FormDatePo> rowlist = new ArrayList<FormDatePo>();
Document doc = DocumentHelper.parseText(data);
Element rootElt = doc.getRootElement(); // 获取根节点
//解析重复表subForms
Iterator iterSubForms = rootElt.elementIterator("subForms");
int index = 0;
while(iterSubForms.hasNext()){
Element applicantSubForms = (Element)iterSubForms.next();
Iterator iterSubForm = applicantSubForms.elementIterator("subForm");
// 对每个重复表进行遍历
while(iterSubForm.hasNext()){
index++;
Element applicantSubForm = (Element)iterSubForm.next();
Iterator iterSubVa = applicantSubForm.elementIterator("values");
while(iterSubVa.hasNext()){
Element applicantSubVa = (Element)iterSubVa.next();
Iterator iterRowsVa = applicantSubVa.elementIterator("row");
while(iterRowsVa.hasNext()){
// 创建list保存每行重复表信息
Element applicantRowsVa = (Element)iterRowsVa.next();
Iterator iterRowCol = applicantRowsVa.elementIterator("column");
while(iterRowCol.hasNext()){
FormDatePo formDate = new FormDatePo();
Element applicantColVa = (Element)iterRowCol.next();
formDate.setBeanName(applicantColVa.attributeValue("name"));
Iterator iterRowColVa = applicantColVa.elementIterator("value");
while(iterRowColVa.hasNext()){
Element applicantRowColVa = (Element)iterRowColVa.next();
//通过这个方法可以通过遍历xml各节点然后获取相应节点的数值,存到
PO中,并且放到集合里面
//如果想要改变对应节点的值可以用这个方法
//
if(applicantColVa.attributeValue("name").equals("附件")){
formDate.setBeanDisplay(applicantRowColVa.getText());
rowlist.add(formDate);
//这里是修改值的方法
applicantRowColVa.setText(attStr);
}
}
}
}
}
}
}
return rowlist;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
需要哪个节点下的数据,就从哪个标签开始迭代。很方便,对应的节点也能根据节点的特征类修改
这里加入rowlist中的数据需要处理的话也能取出来处理
可以看到附件这里的值是几个附件的id用“|”分开的,这里处理一下
,我是放到数组里面
for (int i = 0; i < fileList.size(); i++) {
String tmp = fileList.get(i).getBeanDisplay();
Long subId = Long.valueOf(fileIdList.get(i).getBeanDisplay());
long[] a = new long[5];
String spliter = null;
int ind = -1;
while(tmp.contains("|")){
ind++;
int j = tmp.indexOf("|");
spliter = tmp.substring(0,j);
a[ind] = Long.valueOf(spliter);
tmp = tmp.substring(j+1);
}
a[ind+1] =Long.valueOf(tmp);
}
考虑到附件的数量不会太多,这里把数组长度设置为5,当然
数组可能元素不满,再取出的时候要做非空判断。做好必要的处理