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; } }