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