XML文件的解析

来源:互联网 发布:md5摘要算法 编辑:程序博客网 时间:2024/06/10 15:02
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,当然
数组可能元素不满,再取出的时候要做非空判断。做好必要的处理