解析xml文档,并将xml文档中的数据拼接成insert语句

education.xml的内容是:

<?xml version="1.0" encoding="utf-8"?>
<Msg>
<Head>
  <Id>20140529100039</Id>
  <Name>厦烟人事子集查询回复</Name>
  <Source>HR</Source>
  <Target>XYRC</Target>
  <SerName>ws_inferConnect</SerName>
  <MsgType>2</MsgType>
  <RtCode>1</RtCode>
  <RtDesc></RtDesc>
  <Backup1></Backup1>
  <Date>2018/09/20 15:40:21</Date>
  <Attrs>
    <Attr desc='子集名' illus='SPECIALTY_TEC'>SPECIALTY_TEC</Attr>
    <Attr desc='人员ID' illus='0'>70025</Attr>
    <Attr>abcd</Attr>
  </Attrs>
</Head>
<DATA>
  <TABLE TABLENAME='SPECIALTY_TEC' BASIC_ID='人员ID' NAME='姓名' ZYJSRJZG='专业技术资格名称' QUACHANLL='取得资格途径' QUADATEE='取得资格日期' TESTNAME='资格审批单位' POSORDER='专业技术职务名称' ZYJSZWDJ='专业技术资格等级' REM='备注'>
    <ROW ACTION='QUERY' BASIC_ID='70025' NAME='吴志文' ZYJSRJZG='助理工程师' QUACHANLL='确认' QUADATEE='1992-08-01 00:00' TESTNAME='厦门卷烟厂职称改革领导小组' POSORDER='工程技术人员' ZYJSZWDJ='助理级(助教级)' REM=''/>
    <ROW ACTION='QUERY' BASIC_ID='70025' NAME='吴志文' ZYJSRJZG='高级经济师' QUACHANLL='评审' QUADATEE='2007-11-22 00:00' TESTNAME='中国烟草总公司高级经济师任职资格评审委员会' POSORDER='经济人员' ZYJSZWDJ='副高级(副教授级)' REM=''/>
    <ROW ACTION='QUERY' BASIC_ID='70025' NAME='吴志文' ZYJSRJZG='工程师' QUACHANLL='评审' QUADATEE='1997-11-21 00:00' TESTNAME='福建省烟草专卖局职称改革领导小组' POSORDER='工程技术人员' ZYJSZWDJ='中级(讲师级)' REM=''/>
  </TABLE>
</DATA>
</Msg>

开始解析

public class AnalysisXmlAction {
    
    public static void main(String[] args) {
        SAXReader saxReader = new SAXReader();
        Document document;
        String xmlString = "";
        try {
            document = saxReader.read(new File("src/main/resources/education.xml"));
            xmlString = document.asXML();// 将xml内容转化为字符串
        } catch (Exception e) {
            e.printStackTrace();
            xmlString = "";
        }
        new AnalysisXmlAction().analysisXml(xmlString);
    }

    @SuppressWarnings("rawtypes")
    public void analysisXml(String str) {
        List<String> sqlArray = new ArrayList<String>();
        try {
            // 通过reader对象的read方法加载books.xml文件,获取docuemnt对象。
            Document document = DocumentHelper.parseText(str);
            // 通过document对象获取根节点bookstore
            Element bookStore = document.getRootElement();
            // 通过element对象的elementIterator方法获取迭代器
            Iterator oneLev = bookStore.elementIterator(); // 第一层下面的子集
            // 遍历迭代器,获取根节点中的信息
            while (oneLev.hasNext()) {
                Element data = (Element) oneLev.next();
                // 获取book的属性名以及 属性值
                Iterator twoLev = data.elementIterator(); // 获取子节点
                String sql = "";
                while (twoLev.hasNext()) {
                    Element bookChild = (Element) twoLev.next();
                    String name = bookChild.getName();
                    @SuppressWarnings("unchecked")
                    List<Attribute> twoLevAttr = bookChild.attributes();
                    if ("TABLE".equalsIgnoreCase(name)) {
                        for (Attribute attr : twoLevAttr) {// 遍历当前节点的所有属性
                            String attrName = attr.getName();// 属性名称
                            String attrValue = attr.getValue();
                            if (!"TABLENAME".equalsIgnoreCase(attrName)) {
                                sql +=  attrName + "," ;
                            } else {
                                sql += "insert into RL_" + attrValue + "(id_key,";
                            }
                        }
                        sql = sql.substring(0, sql.length() - 1);
                        sql += ") values (xyrc.seq_cnp_idkey.nextval,";
                        Iterator threeLev = bookChild.elementIterator();
                        while (threeLev.hasNext()) {
                            String insertSql = sql;
                            Element bookChildAttrs = (Element) threeLev.next();
                            @SuppressWarnings("unchecked")
                            List<Attribute> listAttr = bookChildAttrs.attributes();
                            for (Attribute attr : listAttr) {// 遍历当前节点的所有属性
                                String value = attr.getValue();// 属性的值
                                if (!"QUERY".equalsIgnoreCase(value)) {
                                    insertSql += "'" + value + "',";
                                }

                            }
                            insertSql = insertSql.substring(0, insertSql.length() - 1);
                            insertSql += ")";
                            sqlArray.add(insertSql);
                            System.out.println("insertSql:" + insertSql);
                        }
                    }
                }
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
        //analysisXmlService.insertAll(sqlArray);
    }
    
}

最后拼成的sql语句是:

insert into RL_SPECIALTY_TEC(id_key,BASIC_ID,NAME,ZYJSRJZG,QUACHANLL,QUADATEE,TESTNAME,POSORDER,ZYJSZWDJ,REM) values (xyrc.seq_cnp_idkey.nextval,'70025','吴志文','助理工程师','确认','1992-08-01 00:00','厦门卷烟厂职称改革领导小组','工程技术人员','助理级(助教级)','')

猜你喜欢

转载自blog.csdn.net/Jon_jing/article/details/83143729