JAVA之XML文件解析(根据头部和身体自动组合成SQL)

package com.citic.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

import com.citic.supis.domain.SqlEntityStatment;
import com.citic.util.comm.CommFun;
import com.citic.util.comm.IConstants;

public class XMLUtil implements IConstants{
    private static String oldtag = "";
    private static String xmlstr = "", xmlheads = "";
    private static int debuglevel = 0;

    public static void xmlCreate(String tmpstr, String createxmlfile) {
        if(tmpstr.length()<minxmllength){
            return;    
        }
        try {
            xmlCreate(DocumentHelper.parseText(tmpstr), createxmlfile);
        } catch (DocumentException e) {
            CommFun.log(ERR, "根据字符串创建XML文档出错开始");
            CommFun.log(ERR,tmpstr);
            e.printStackTrace();
            CommFun.log(ERR, "根据字符串创建XML文档出错信息结束");
        }
    }
    
    
    public static void xmlCreate(Document document, String createxmlfile) {
        OutputFormat format = OutputFormat.createPrettyPrint();
        String encod = "UTF-8";
        format.setEncoding(encod);
        int bytes = 0;
        format.setNewLineAfterDeclaration(false);
        String pthseparator = System.getProperty("file.separator");
        File f = new File(createxmlfile.substring(0,
                createxmlfile.lastIndexOf(pthseparator)));
        CommFun.log(debuglevel, f.getParent()+","+createxmlfile);
        if (!f.exists()) {
            f.mkdirs();
        }

        FileOutputStream fos;
        try {
            bytes = document.asXML().getBytes(encod).length;
            fos = new FileOutputStream(createxmlfile);
            XMLWriter writer= new XMLWriter(fos, format);
            writer.write(document);
            writer.close();
            fos.close();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        CommFun.log(debuglevel, "xmlcreate:" + createxmlfile + ":" + bytes
                + ":");
    }

    public static SqlEntityStatment dispElementshead(Document doc,
            HashMap nsMap, String tagname) {
        String xmlstr = "", xmlheads = "";
        SqlEntityStatment ses1 = new SqlEntityStatment();
        XPath xsub = doc.createXPath("//ns:" + tagname);
        xsub.setNamespaceURIs(nsMap);
        List list = xsub.selectNodes(doc);
        Iterator itr = list.iterator();
        int leafcnt = 0, elecnt = 0;
        String oldtag = "", newtag = "";
        for (int i = 0; i < 1; i++) {
            Element pele = (Element) itr.next();
            Iterator itrs = pele.elements().iterator();
            elecnt = pele.elements().size();
            while (itrs.hasNext()) {
                Element ele = (Element) itrs.next();
                newtag = ele.getName();
                if (!"".equals(ele.getTextTrim())) {
                    xmlstr += ",'" + ele.getTextTrim() + "'";
                    xmlheads += "," + ele.getName();
                    if (oldtag.equals(newtag)) {
                    }
                    leafcnt++;
                }
                oldtag = newtag;
            }
        }
        /*
         * defaultsep=subi>0?",":"@"; && elecnt != leafcnt
         */
        if (xmlstr.length() > 0 && list.size() == 1) {
            ses1.setSqlstr(xmlstr.substring(1).trim());
            ses1.setSqlfileds(xmlheads.substring(1).trim());
        }
        // System.out.println("ses1:[" + ses1 + "]");
        CommFun.log(debuglevel, "[" + ses1 + "]");
        xmlstr = "";
        xmlheads = "";
        return ses1; // .substring(1).split(defaultsep);
    }

    /**
     * 适合对并列的并且以下都可以行成一列的
     * 
     * @param ele
     */
    public static SqlEntityStatment displayAllEle(Element ele) {
        Iterator itr = ele.elements().iterator();
        Element element;
        String tagname, text, sf = "";
        SqlEntityStatment sestmp = null;
        while (itr.hasNext()) {
            element = (Element) itr.next();
            tagname = element.getName();
            text = element.getTextTrim();
            if ("".equals(text)) {
                displayAllEle(element);
                // xmlstr = "";
                // xmlheads = "";
            } else {
                if (!oldtag.equals(tagname)) {
                    xmlheads += "," + tagname;
                } else {
                    sf = "@";
                }
                xmlstr += "," + sf + text;
                oldtag = tagname;
            }
        }
        if (!"".equals(xmlstr)) {
            String xmltmp = xmlstr.substring(1);
            xmltmp = xmltmp.replace(",@", "@");
            xmltmp = "'" + xmltmp.replace(",", "','") + "'";
            // sestmp.setSqlfileds(xmlheads);
            // sestmp.setSqlstr(xmltmp);
            sestmp = new SqlEntityStatment(xmlheads.substring(1), xmltmp);
            // 张明伟 测试20170407 START
            // System.out.println("sestmp:[" + sestmp + "]");
            // System.out.println("xmltmp:[" + xmltmp + "]");
            // System.out.println("xmlheads:[" + xmlheads + "]");
            // 张明伟 测试20170407 END
        }
        return sestmp;
    }

    /**
     * 此功能只处理并列多行的数据,如产生DiffList多行数据
     * 
     * @param doc
     * @param nsMap
     * @param tagname
     */
    public static SqlEntityStatment[] dispElements1(Document doc,
            HashMap nsMap, String tagname) {
        SqlEntityStatment[] sestmps = null;
        XPath xsub = doc.createXPath("//ns:" + tagname);
        xsub.setNamespaceURIs(nsMap);
        List list = xsub.selectNodes(doc);
        Iterator itr = list.iterator();
        int listsize = list.size();
        if (listsize < 1) {
            return null;
        }
        sestmps = new SqlEntityStatment[listsize];
        for (int i = 0; i < listsize; i++) {
            xmlstr = "";
            xmlheads = "";
            Element pele = (Element) itr.next();
            sestmps[i] = new SqlEntityStatment(displayAllEle(pele));
            // 张明伟 测试20170407
            CommFun.log(debuglevel, "...." + sestmps[i]);
            // 张明伟 测试20170407
        }
        return sestmps;
    }

    public static SqlEntityStatment[] mergedata(SqlEntityStatment sestmp1,
            SqlEntityStatment[] sestmps1) {
        if (sestmps1 == null && sestmp1 == null) {
            return null;
        } else if (sestmps1 == null) {
            return new SqlEntityStatment[] { sestmp1 };
        } else if (sestmp1 == null) {
            return sestmps1;
        }
        
        int len = sestmps1.length;
        SqlEntityStatment[] sestmps2 = new SqlEntityStatment[len];
        String tmpfld = "", tmpstr = "";
        for (int i = 0; i < len ; i++) {
            tmpfld = "";
            tmpstr = "";
            if(sestmps1[i]!=null){
                tmpfld = sestmp1.getSqlfileds() + "," + sestmps1[i].getSqlfileds();
                tmpstr = sestmp1.getSqlstr() + "," + sestmps1[i].getSqlstr();
            }
            sestmps2[i] = new SqlEntityStatment(tmpfld, tmpstr);
            // 张明伟 测试20170407
            CommFun.log(debuglevel, "[" + i + "]:" + sestmps2[i]);
            // 张明伟 测试20170407
        }
        return sestmps2;
    }
}

 

posted @ 2020-04-04 16:02  silencemaker1221  阅读(511)  评论(0编辑  收藏  举报