代码分析:

article/2025/5/14 14:56:10

爬虫组件分析

  • 目录
    • 概述
      • 需求:
    • 设计思路
    • 实现思路分析
      • 1.URL管理
    • DataTable
  • 参考资料和推荐阅读

Survive by day and develop by night.
talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive.
happy for hardess to solve denpendies.

目录

在这里插入图片描述

概述

AtPara 代码分析:

需求:

设计思路

实现思路分析

1.URL管理

package bp.da;
import java.io.File;
import java.util.Hashtable;import bp.difference.ContextHolderUtils;
import bp.difference.SystemConfig;
import bp.en.Attr;
import bp.en.Attrs;
import bp.en.Entities;
import bp.en.Entity;
import bp.en.Map;
import bp.en.SQLCash;
import bp.tools.ConvertTools;/*** Cash 的摘要说明。*/
public class Cash {public static final  Hashtable<String, Object> CS_Cash = new Hashtable<>();public   Cash(){/*if (!SystemConfig.getIsBSsystem()) {CS_Cash = new Hashtable<String, Object>();}*/}private static String bsCashKey = SystemConfig.getRedisCacheKey("BSCash");private static  Hashtable<String, Object> _BS_Cash = new Hashtable<>();public static Hashtable<String, Object> getBS_Cash() {_BS_Cash =ContextHolderUtils.getRedisUtils().hget(false,bsCashKey);return _BS_Cash;}// Bill_Cash 单据模板cash.private static String billCashKey = SystemConfig.getRedisCacheKey("BillCash");private static  Hashtable<String, Object> _Bill_Cash = new Hashtable<>();public static Hashtable<String, Object> getBill_Cash() {_Bill_Cash= ContextHolderUtils.getRedisUtils().hget(false,billCashKey);return _Bill_Cash;}// BS_Cashpublic static void ClearCash() {if (_BS_Cash != null){_BS_Cash.clear();ContextHolderUtils.getRedisUtils().del(false,bsCashKey);}if (_SQL_Cash != null){_SQL_Cash.clear();ContextHolderUtils.getRedisUtils().del(false,sqlCashKey);}if (_EnsData_Cash != null){_EnsData_Cash.clear();ContextHolderUtils.getRedisUtils().del(false,ensDataCashKey);}if (_Map_Cash != null){_Map_Cash.clear();ContextHolderUtils.getRedisUtils().del(false,mapCashKey);}if (_EnsData_Cash_Ext != null){_EnsData_Cash_Ext.clear();ContextHolderUtils.getRedisUtils().del(false,ensCashExtKey);}if (_Bill_Cash != null){_Bill_Cash.clear();ContextHolderUtils.getRedisUtils().del(false,billCashKey);}}// SQL cashprivate static String sqlCashKey = SystemConfig.getRedisCacheKey("SQLCash");private static  Hashtable<String, Object> _SQL_Cash = new Hashtable<>();public static  Hashtable<String, Object> getSQL_Cash() {_SQL_Cash  = ContextHolderUtils.getRedisUtils().hget(false,sqlCashKey);return _SQL_Cash;}public static SQLCash GetSQL(String clName) {SQLCash tempVar = (SQLCash) getSQL_Cash().get(clName);return (SQLCash) ((tempVar instanceof SQLCash) ? tempVar : null);}public static void SetSQL(String clName, SQLCash csh) {if (clName == null || csh == null) {throw new RuntimeException("clName.  csh 参数有一个为空。");}getSQL_Cash().put(clName, csh);ContextHolderUtils.getRedisUtils().hset(false,sqlCashKey,clName,csh);}public static void DelSQL(String clName){if (clName == null ) {throw new RuntimeException("clName参数有一个为空。");}ContextHolderUtils.getRedisUtils().hdel(false,sqlCashKey,clName);}// EnsData cashprivate static String ensDataCashKey = SystemConfig.getRedisCacheKey("EnsDataCash");private static  Hashtable<String, Object> _EnsData_Cash = new Hashtable<>();public static Hashtable<String, Object> getEnsData_Cash() {_EnsData_Cash = ContextHolderUtils.getRedisUtils().hget(false,ensDataCashKey);return _EnsData_Cash;}public static Entities GetEnsData(String clName) {Entities tempVar = (Entities) getEnsData_Cash().get(clName);Entities ens = (Entities) ((tempVar instanceof Entities) ? tempVar : null);if (ens == null)return null;if (ens.size() == 0)return null;return ens;}public static void EnsDataSet(String clName, Entities obj) {if (obj.size() == 0) {// throw new Exception(clName +// "设置个数为0 , 请确定这个缓存实体,是否有数据?sq=select * from " +// obj.getGetNewEntity().getEnMap().getPhysicsTable());}getEnsData_Cash().put(clName, obj);ContextHolderUtils.getRedisUtils().hset(false,ensDataCashKey,clName,obj);}public static void remove(String clName) {getEnsData_Cash().remove(clName);ContextHolderUtils.getRedisUtils().hdel(false,ensDataCashKey,clName);}// EnsData cash 扩展 临时的cash 文件。private static String ensCashExtKey = SystemConfig.getRedisCacheKey("EnsDataCashExt");private static  Hashtable<String, Object> _EnsData_Cash_Ext = new Hashtable<>();public static Hashtable<String, Object> getEnsData_Cash_Ext() {_EnsData_Cash_Ext = ContextHolderUtils.getRedisUtils().hget(false,ensCashExtKey);return _EnsData_Cash_Ext;}/*** 为部分数据做的缓冲处理* * param clName* @return*/public static Entities GetEnsDataExt(String clName) {// 判断是否失效了。if (SystemConfig.getIsTempCashFail()) {getEnsData_Cash_Ext().clear();ContextHolderUtils.getRedisUtils().del(false,ensCashExtKey);return null;}try {Entities ens;Entities tempVar = (Entities) getEnsData_Cash_Ext().get(clName);ens = (Entities) ((tempVar instanceof Entities) ? tempVar : null);return ens;} catch (java.lang.Exception e) {return null;}}/*** 为部分数据做的缓冲处理* * param clName* param obj*/public static void SetEnsDataExt(String clName, Entities obj) {if (clName == null || obj == null) {throw new RuntimeException("clName.  obj 参数有一个为空。");}getEnsData_Cash_Ext().put(clName, obj);ContextHolderUtils.getRedisUtils().hset(false,ensCashExtKey,clName,obj);}private static String mapCashKey = SystemConfig.getRedisCacheKey("MapCash");private static Hashtable<String, Object> _Map_Cash;public static Hashtable<String, Object> getMap_Cash() {if (_Map_Cash == null) {_Map_Cash = new Hashtable<String, Object>();}//_Map_Cash = ContextHolderUtils.getRedisUtils().hget(false,mapCashKey);return _Map_Cash;}public static Map GetMap(String clName) {try {Map tempVar = (Map) getMap_Cash().get(clName);return (Map) ((tempVar instanceof Map) ? tempVar : null);} catch (java.lang.Exception e) {return null;}}public static void SetMap(String clName, Map map) {if (clName == null)return;if (map == null) {getMap_Cash().remove(clName);//ContextHolderUtils.getRedisUtils().hdel(false,mapCashKey,clName);return;}getMap_Cash().put(clName, map);//ContextHolderUtils.getRedisUtils().hset(false,mapCashKey,clName,map);}// 取出对象/*** 从 Cash 里面取出对象.*/public static Object GetObj(String key, Depositary where) {if (where == Depositary.None) {throw new RuntimeException("您没有把(" + key + ")放到session or application 里面不能找出他们.");}//if (SystemConfig.getIsBSsystem()) {if (where == Depositary.Application){return getBS_Cash().get(key);} else {return ContextHolderUtils.getSession().getAttribute(key);}/*} else {return CS_Cash.get(key);}*/}public static Object GetObj(String key) {//if (SystemConfig.getIsBSsystem()) {Object obj = getBS_Cash().get(key); // Cash.GetObjFormApplication(key,// null);if (obj == null) {obj = Cash.GetObjFormSession(key);}return obj;/*} else {return CS_Cash.get(key);}*/}/*** 删除 like 名称的缓存对象。* * param likeKey* @return*/public static int DelObjFormApplication(String likeKey) {int i = 0;//if (SystemConfig.getIsBSsystem()) {String willDelKeys = "";for (Object key : getBS_Cash().keySet()) {if (!key.toString().contains(likeKey)) {continue;}willDelKeys += "@" + key;}String[] strs = willDelKeys.split("(@)", -1);for (String s : strs) {if (DataType.IsNullOrEmpty(s) == true) {continue;}getBS_Cash().remove(s);i++;}/*} else {String willDelKeys = "";for (Object key : CS_Cash.keySet()) {if (!key.toString().contains(likeKey)) {continue;}willDelKeys += "@" + key;}String[] strs = willDelKeys.split("(@)", -1);for (String s : strs) {if (DataType.IsNullOrEmpty(s) == true) {continue;}CS_Cash.remove(s);i++;}}*/return i;}public static Object GetObjFormApplication(String key, Object isNullAsVal) {//if (SystemConfig.getIsBSsystem()) {Object obj = getBS_Cash().get(key); // BP.Glo.HttpContextCurrent.Cache(key);if (obj == null) {return isNullAsVal;} else {return obj;}/*} else {Object obj = CS_Cash.get(key);if (obj == null) {return isNullAsVal;} else {return obj;}}*/}public static Object GetObjFormSession(String key) {//if (SystemConfig.getIsBSsystem()) {try {/** warning return BP.Glo.getHttpContextCurrent().Session(key);*/return ContextHolderUtils.getSession().getAttribute(key);} catch (java.lang.Exception e) {return null;}/*} else {return CS_Cash.get(key);}*/}// remove Obj/*** RemoveObj* * param key* param where*/public static void RemoveObj(String key, Depositary where) {if (!Cash.IsExits(key, where)) {return;}//if (SystemConfig.getIsBSsystem()) {if (where == Depositary.Application) {/** warning BP.Glo.getHttpContextCurrent().Cache.remove(key);*/} else {/** warning BP.Glo.getHttpContextCurrent().Session.remove(key);*/ContextHolderUtils.getSession().removeAttribute(key);}/*} else {CS_Cash.remove(key);}*/}// 放入对象public static void RemoveObj(String key) {getBS_Cash().remove(key);ContextHolderUtils.getRedisUtils().hdel(false,bsCashKey,key);}public static void AddObj(String key, Depositary where, Object obj) {if (key == null) {throw new RuntimeException("您需要为obj=" + obj.toString() + ",设置为主键值。key");}if (obj == null) {throw new RuntimeException("您需要为obj=null  设置为主键值。key=" + key);}if (where == Depositary.None) {throw new RuntimeException("您没有把(" + key + ")放到 session or application 里面设置他们.");}// if (Cash.IsExits(key, where))// return;//if (SystemConfig.getIsBSsystem()) {if (where == Depositary.Application) {getBS_Cash().put(key, obj);} else {/** warning BP.Glo.getHttpContextCurrent().Session(key) = obj;*///ContextHolderUtils.getSession().setAttribute(key, obj);}/*} else {if (CS_Cash.containsKey(key)) {CS_Cash.put(key, obj);} else {CS_Cash.put(key, obj);}ContextHolderUtils.getRedisUtils().hset(false,billCashKey,key,obj);}*/}// 判断对象是不是存在/*** 判断对象是不是存在*/public static boolean IsExits(String key, Depositary where) {//if (SystemConfig.getIsBSsystem()) {if (where == Depositary.Application) {return true;} else {return true;}/*} else {return CS_Cash.containsKey(key);}*/}public static String GetBillStr(String cfile, boolean isCheckCash) throws Exception {String val = (String) ((getBill_Cash().get(cfile) instanceof String) ? getBill_Cash().get(cfile) : null);if (isCheckCash == true) {val = null;}if (DataType.IsNullOrEmpty(val)) {String file = null;if (cfile.contains(":")) {file = cfile;} else {file = SystemConfig.getPathOfDataUser() + "CyclostyleFile/" + cfile;}try {val = ConvertTools.StreamReaderToStringConvert(file, "us-ascii");} catch (Exception ex) {throw new RuntimeException("@读取单据模板时出现错误。cfile=" + cfile + " @Ex=" + ex.getMessage());}_Bill_Cash.put(cfile, val);ContextHolderUtils.getRedisUtils().hset(false,billCashKey,cfile,val);}return val.substring(0);}public static String[] GetBillParas(String cfile, String ensStrs, Entities ens) throws Exception {String[] paras = (String[]) ((getBill_Cash().get(cfile + "Para") instanceof String[])? getBill_Cash().get(cfile + "Para") : null);if (paras != null) {return paras;}Attrs attrs = new Attrs();for (Entity en : Entities.convertEntities(ens)) {String perKey = en.toString();Attrs enAttrs = en.getEnMap().getAttrs();for (Attr attr : Attrs.convertAttrs(enAttrs)) {Attr attrN = new Attr();attrN.setKey(perKey + "." + attr.getKey());// attrN.Key = attrN.getKey().replace("\\f2","");// attrN.Key = attrN.getKey().replace("\\f3", "");if (attr.getIsRefAttr()) {attrN.setField(perKey + "." + attr.getKey() + "Text");}attrN.setMyDataType(attr.getMyDataType());attrN.setMyFieldType(attr.getMyFieldType());attrN.setUIBindKey(attr.getUIBindKey());attrN.setField(attr.getField());attrs.Add(attrN);}}paras = Cash.GetBillParas_Gener(cfile, attrs);_Bill_Cash.put(cfile + "Para", paras);return paras;}public static String[] GetBillParas(String cfile, String ensStrs, Entity en) throws Exception {String[] paras = (String[]) ((getBill_Cash().get(cfile + "Para") instanceof String[])? getBill_Cash().get(cfile + "Para") : null);if (paras != null) {return paras;}paras = Cash.GetBillParas_Gener(cfile, en.getEnMap().getAttrs());_Bill_Cash.put(cfile + "Para", paras);return paras;}public static String[] GetBillParas_Gener(String cfile, Attrs attrs) throws Exception {// Attrs attrs = en.getEnMap().getAttrs();String[] paras = new String[300];String Billstr = Cash.GetBillStr(cfile, true);char[] chars = Billstr.toCharArray();String para = "";int i = 0;boolean haveError = false;String msg = "";for (char c : chars) {if (c == '>') {// 首先解决空格的问题.String real = para.toString();if (attrs != null && real.contains(" ")) {real = real.replace(" ", "");Billstr = Billstr.replace(para, real);para = real;haveError = true;}// 解决特殊符号if (attrs != null && real.contains("\\") && real.contains("ND") == false) {haveError = true;String findKey = null;int keyLen = 0;for (Attr attr : attrs.ToJavaList()) {if (real.contains(attr.getKey())) {if (keyLen <= attr.getKey().length()) {keyLen = attr.getKey().length();findKey = attr.getKey();}}}if (findKey == null) {msg += "@参数:<font color=red><b>(" + real + ")</b></font>可能拼写错误。";continue;}if (real.contains(findKey + ".NYR") == true) {real = findKey + ".NYR";} else if (real.contains(findKey + ".RMB") == true) {real = findKey + ".RMB";} else if (real.contains(findKey + ".RMBDX") == true) {real = findKey + ".RMBDX";} else {real = findKey;}Billstr = Billstr.replace(para, real);// msg += "@参数:<font color=red><b>(" + para +// ")</b></font>不符合规范。";// continue;}// paras.SetValue(para, i);paras[i] = para;i++;}if (c == '<') {para = ""; // 如果遇到了 '<' 开始记录} else {if ((new Character(c)).toString().equals("")) {continue;}para += (new Character(c)).toString();}}if (haveError) {String myfile = SystemConfig.getPathOfDataUser() + "/CyclostyleFile/" + cfile;if (!new File(myfile).exists()) {myfile = cfile;}// throw new Exception("@没有文件:"+myfile);try {ConvertTools.StreamWriteConvert(Billstr, myfile);} catch (Exception e) {e.printStackTrace();}// StreamWriter wr = new StreamWriter(myfile, false,// Encoding.ASCII);// wr.Write(Billstr);// wr.Close();}if (!msg.equals("")) {// String s =// "@帮助信息:用记事本打开它模板,找到红色的字体.// 把尖括号内部的非法字符去了,例如:《|f0|fs20RDT.NYR|lang1033|kerning2》,修改后事例:《RDT.NYR》。@注意把双引号代替单引号,竖线代替反斜线。";// throw new// Exception("@单据模板("+cfile+")如下标记出现错误,系统无法修复它,需要您手工的删除标记或者用记事本打开查找到这写标记修复他们.@"// + msg + s);}return paras;}
}
package bp.da;import bp.difference.ContextHolderUtils;
import bp.difference.SystemConfig;
import bp.en.Entities;
import bp.en.Row;
import bp.tools.StringUtils;import java.util.Hashtable;/***  hashtable*  	--  entity*  		--  row*//**实体缓存
*/
public class Cash2019
{public static String redisKey = SystemConfig.getRedisCacheKey("Case2019");/**清除所有的实体缓存.*/
/*	public static void ClearCash(){
//		_hts = null;ContextHolderUtils.getRedisUtils().del(false,redisKey);}*///缓存ht// en-pk
//	private static Hashtable _hts;
//	public static Hashtable getHts()
//	{
//
//		_hts =ContextHolderUtils.getRedisUtils().hget(false,redisKey);
//		if (_hts == null)
//		{
//			_hts = new Hashtable<>();
//		}
//
//		return _hts;
//	}///对实体的操作./** 把实体放入缓存里面param enNameparam pkValparam row*/public static void PutRow(String enName, String pkVal, Row row)  {
//		synchronized (lockObj)
//		{
//			Object tempVar = getHts().get(enName);
//			Hashtable<String,Object> ht = tempVar instanceof Hashtable ? (Hashtable<String,Object>)tempVar : null;
//			if (ht == null)
//			{
//				ht = new Hashtable<>();
//				getHts().put(enName, ht);
//			}
//			ht.put(pkVal, row);
//			ContextHolderUtils.getRedisUtils().hset(false,redisKey,enName,ht, 300);if(StringUtils.isBlank(pkVal)) return;ContextHolderUtils.getRedisUtils().set(false, SystemConfig.getRedisCacheKey(enName + "_"+pkVal), row);
//		}}public static void UpdateRow(String enName, String pkVal, Row row)  {
//		synchronized (lockObj)
//		{
//			Object tempVar = getHts().get(enName);
//			Hashtable<String,Object> ht = tempVar instanceof Hashtable ? (Hashtable)tempVar : null;
//			if (ht == null)
//			{
//				ht = new Hashtable<>();
//				getHts().put(enName, ht);
//
//			}
//			ht.put(pkVal, row);
//			ContextHolderUtils.getRedisUtils().hset(false,redisKey,enName,ht, 300);if(StringUtils.isBlank(pkVal)) return;ContextHolderUtils.getRedisUtils().set(false, SystemConfig.getRedisCacheKey(enName + "_"+pkVal), row);
//		}}public static void DeleteRow(String enName, String pkVal)  {
//		synchronized (lockObj)
//		{
//			Object tempVar = getHts().get(enName);
//			Hashtable<String,Object> ht = tempVar instanceof Hashtable ? (Hashtable)tempVar : null;
//			if (ht == null)
//			{
//				ht = new Hashtable<>();
//				getHts().put(enName, ht);
//			}
//			ht.remove(pkVal.toString());
//			ContextHolderUtils.getRedisUtils().hset(false,redisKey,enName,ht,300);ContextHolderUtils.getRedisUtils().del(false, SystemConfig.getRedisCacheKey(enName + "_"+pkVal));
//		}}
//	private static final Object lockObj = new Object();/** 获得实体类param enName 实体名字param pkVal 键@return row*/public static Row GetRow(String enName, String pkVal)  {
//		synchronized (lockObj)
//		{Object obj = ContextHolderUtils.getRedisUtils().get(false,SystemConfig.getRedisCacheKey(enName + "_"+pkVal));return obj==null ? null : (Row) obj;//			Object tempVar = getHts().get(enName);
//			Hashtable ht = tempVar instanceof Hashtable ? (Hashtable)tempVar : null;
//			if (ht == null)
//				return null;
//			if(DataType.IsNullOrEmpty(pkVal)==true)
//				return null;
//			if (ht.containsKey(pkVal) == true)
//			{
//				return ht.get(pkVal) instanceof Row ? (Row)ht.get(pkVal) : null;
//			}
//			return null;
//		}}/// 对实体的操作.///对实体的集合操作./** 把集合放入缓存.param ensName 集合实体类名param ens 实体集合*/
//	public static void PutEns(String ensName, Entities ens)
//	{
//
//	}/** 获取实体集合类param ensName 集合类名param pkVal 主键@return 实体集合*/
//	public static Entities GetEns(String ensName, Object pkVal)
//	{
//		return null;
//	}}
package bp.da;import bp.difference.ContextHolderUtils;
import bp.difference.SystemConfig;public class CashFrmTemplate {///对实体的操作./*** 放入表单* <p>* param frmID 表单ID* param ds 表单模版** @throws Exception*/public static void Put(String frmID, DataSet ds) throws Exception {if (ds == null) return;String json = bp.tools.Json.ToJson(ds);ContextHolderUtils.getRedisUtils().set(false, SystemConfig.getRedisCacheKey(frmID), json);}/*** 移除* <p>* param frmID 表单ID*/public static void Remove(String frmID) {ContextHolderUtils.getRedisUtils().del(false, SystemConfig.getRedisCacheKey(frmID));}/*** 获得表单DataSet模式的模版数据* <p>* param frmID 表单ID** @return 表单模版*/public static DataSet GetFrmDataSetModel(String frmID) throws Exception {Object result = ContextHolderUtils.getRedisUtils().get(false, SystemConfig.getRedisCacheKey(frmID));if (result != null) {DataSet ds = bp.tools.Json.ToDataSet(result.toString());return ds;}return null;}/*** 获得表单json模式的模版数据* <p>* param frmID 表单ID** @return json*//// 对实体的操作.}
package bp.da;import java.util.HashMap;
import java.util.Map;public class DataColumn
{/*** DataColumn所屬的DataTable*/private DataTable table;/*** DataColumn的欄位名稱*/public String ColumnName; // 欄名,當做DataRow的keypublic String oldColumnName; // 欄名,當做DataRow的keypublic void setColumnName(String val){if (oldColumnName==null)oldColumnName= ColumnName;ColumnName=val;	  }public Object DataType;public Object getDataType()throws Exception{return DataType;}public void setDataType(Object dataType){DataType = dataType;}/*** DataColumn被建立時,一定要指定欄名* * param columnName*            欄名*/public DataColumn(String columnName){this.ColumnName = columnName;this.oldColumnName = columnName;}public DataColumn()throws Exception{}public DataColumn(String columnName, Object DataType){this.ColumnName = columnName;this.oldColumnName = columnName;this.DataType = DataType;}//区分大小写public DataColumn(String columnName, Object DataType, boolean cases){this.ColumnName = columnName;this.oldColumnName = columnName;this.DataType = DataType;}public DataColumn(String columnName, Object DataType, String str){this.ColumnName = columnName;this.oldColumnName = columnName;this.DataType = DataType;}/*** 給DataColumnCollection加入DataColumn時設定所屬的DataTable的方法,同一個package才用到* * param table*/void setTable(DataTable table){this.table = table;}/*** 取得DataColumn所屬的DataTable,唯讀* * @return DataTable*/public DataTable getTable()throws Exception{return this.table;}/*** DataColumn物件的toString(),會回傳自己的欄名* * @return*/@Overridepublic String toString()  {return this.ColumnName;}private int ordinal;public void setOrdinal(int ordinal) {this.ordinal = ordinal;}public int getOrdinal() {return ordinal;}public final Properties ExtendedProperties = new Properties();public static class Properties {private Map<Object, Object> properties = new HashMap<Object, Object>();public void Add(Object key, Object value) {this.properties.put(key, value);}public boolean ContainsKey(Object key) {return this.properties.containsKey(key);}public Object get(Object key) {return this.properties.get(key);}}}
package bp.da;import java.util.ArrayList;public class DataColumnCollection extends ArrayList<DataColumn>
{/*** */private static final long serialVersionUID = 1L;/*** DataColumnCollection所屬的DataTable,唯讀*/private DataTable Table;/*** DataColumnCollection被建立時,一定要指定所屬的DataTable* * param table*/public DataColumnCollection(DataTable table){this.Table = table;}/*** 取得DataColumnCollection所屬的DataTable* * @return DataTable*/public DataTable getTable()throws Exception{return this.Table;}/*** 加入一個DataColumn物件,程式碼會設定該DataColumn的DataTable和呼叫Add()* 方法的DataColumnCollection同一個DataTable* * param column*/public void Add(DataColumn column){column.setTable(this.Table);this.add(column);}/*** 給欄位名稱 <br/>* 加入一個DataColumn物件,程式碼會設定該DataColumn的DataTable和呼叫Add()* 方法的DataColumnCollection同一個DataTable* * param columnName* @return*/public DataColumn Add(String columnName){DataColumn column = new DataColumn(columnName);column.setTable(this.Table);this.add(column);return column;}public DataColumn Add(String columnName, Object DataType){DataColumn column = new DataColumn(columnName, DataType);column.setTable(this.Table);this.add(column);return column;}public DataColumn Add_UL(String columnName, Object DataType){DataColumn column = new DataColumn(columnName, DataType, null);column.setTable(this.Table);this.add(column);return column;}/*** 依據欄名,取得DataColumn* * param columnName*            欄名* @return DataColumn*/public DataColumn get(String columnName){DataColumn column = null;for (DataColumn dataColumn : this){if (dataColumn.ColumnName.toLowerCase().equals(columnName.toLowerCase())){if (dataColumn.oldColumnName==null   )dataColumn.oldColumnName= dataColumn.ColumnName;return dataColumn;}}return column;}/*** 比较时忽略大小写*/@Overridepublic boolean contains(Object o) {for (int i = 0; i < this.size(); i++) {if (o.toString().equalsIgnoreCase(this.get(i).toString())) {return true;}}return false;}
}
package bp.da;import java.util.LinkedHashMap;
import bp.tools.StringUtils;public class DataRow extends LinkedHashMap<String, Object>
{/*** */private static final long serialVersionUID = 1L;/*** 此資料列所屬的DataTable,唯讀*/public transient DataTable table;/*** 在getValue()和setValue()時候,程式碼須透過此成員的欄位名稱來找出Map字典裡的物件*/public transient DataColumnCollection columns;public transient Object ItemArray;public Object getItemArray() {return ItemArray;}public void setItemArray(Object itemArray) {ItemArray = itemArray;}/*** DataRow被建立時,必須指定所屬的DataTable* * param table*/public DataRow(DataTable table){this.table = table;this.columns = table.Columns;}/*** 取得DataRow所屬的DataTable* * @return DataTable*/public DataTable getTable()throws Exception{return this.table;}/*** 設定該列該行的值* * param columnIndex*            行索引(從0算起)* param value*            要設定的值*/public void setValue(int columnIndex, Object value){setValue(this.columns.get(columnIndex), value);}public void setDataType(int columnIndex, Object dataType){this.columns.get(columnIndex).setDataType(dataType);}/*** 設定該列該行的值* * param columnName*            行名稱* param value*            要設定的值*/public void setValue(String columnName, Object value){this.put(columnName, value);// this.put(columnName, value);}public void setValue(String columnName, Boolean value){if (value==true)this.put(columnName, 1);elsethis.put(columnName, 0);	// this.put(columnName, value);}public void setValueStr(String columnName, String value){this.put(columnName, "\""+value+"\"");// this.put(columnName, value);}/*** 設定該列該行的值 区分大小写* * param columnName*            行名稱* param value*            要設定的值*/public void setValue2017(String columnName, Object value){this.put(columnName, value);}/*** 設定該列該行的值* * param column*            DataColumn物件* param value*            要設定的值*/public void setValue(DataColumn column, Object value){if (column != null){String lowerColumnName = column.ColumnName;if (this.containsKey(lowerColumnName))this.remove(lowerColumnName);this.put(lowerColumnName, value);}}/*** 区分大小写* * param column* param value*/public void setValue_UL(DataColumn column, Object value)throws Exception{if (column != null){String lowerColumnName = column.ColumnName;// String lowerColumnName = column.ColumnName;if (this.containsKey(lowerColumnName))this.remove(lowerColumnName);this.put(lowerColumnName, value);}}/*** 取得該列該行的值* * param columnIndex*            行索引(從0算起)* @return Object*/public Object getValue(int columnIndex){Object obj = this.get(this.columns.get(columnIndex).ColumnName);if (obj == null){obj = "";}return obj;// return// this.get(this.columns.get(columnIndex).ColumnName.toLowerCase());}/*** 取得該列該行的值* * param columnName*            行名稱* @return Object*/public Object getValue(String columnName){Object obj = this.get(columnName);if (obj == null){if(!DataType.IsNullOrEmpty(this.get(columnName.toLowerCase())))return this.get(columnName.toLowerCase());if(!DataType.IsNullOrEmpty(this.get(columnName.toUpperCase())))return this.get(columnName.toUpperCase());return "";}return obj;}/*** 取得該列該行的值* * param column*            DataColumn物件* @return Object*/public Object getValue(DataColumn column){Object obj = this.get(column.ColumnName);if (obj == null){obj = "";}return obj;}public void set(String string, Object object) {if (object==null)object="";this.set(string, object.toString());}
}
package bp.da;import java.io.*;import java.util.ArrayList;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;import bp.difference.SystemConfig;import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;import org.springframework.core.io.ClassPathResource;public class DataSet {private String name;public List<DataTable> Tables;public Hashtable<String, DataTable> hashTables;public DataSet() {if (Tables == null) {Tables = new ArrayList<DataTable>();hashTables = new Hashtable<String, DataTable>();}}public boolean removeTableByName(String tableName){for (DataTable dtb : this.Tables){if( tableName.equals(dtb.getTableName())){this.Tables.remove(dtb);return true;}}return false;}public DataTable GetTableByName(String tableName){for (DataTable dtb : this.Tables){if( tableName.equals(dtb.getTableName())){return dtb;}}return null;}/*** 判断DataSet中是否包含指定的名称的DataTable数据* @param tableName* @return*/public boolean contains(String tableName){boolean isHave=false;for (DataTable dtb : this.Tables){if( tableName.equals(dtb.getTableName())){isHave = true;break;}}return isHave;}public DataSet(String name)  {if (Tables == null) {Tables = new ArrayList<DataTable>();hashTables = new Hashtable<String, DataTable>();}}/*** DataSet 以xml形式写入文件** param file* @throws Exception*/public void WriteXml(String file)  {WriteXml(file, XmlWriteMode.IgnoreSchema, new DataSet("NewDataSet"));}/*** DataSet 以xml形式写入文件** param path* param mode*            暂不支持DiffGram格式* @throws Exception*/public void WriteXml(String path, XmlWriteMode mode, DataSet ds) {StringBuilder str = new StringBuilder("<?xml version=\"1.0\" standalone=\"yes\"?>");str.append("<NewDataSet>");// 输出表架构for (int i = 0; i < ds.Tables.size(); i++) {DataTable dt = ds.Tables.get(i);for (int k = 0; k < dt.Rows.size(); k++) {str.append("<");str.append(dt.getTableName());str.append(">");for (int j = 0; j < dt.Columns.size(); j++) {DataColumn dc = dt.Columns.get(j);str.append("<");str.append(dc.ColumnName);str.append(">");try {Object value = dt.Rows.get(k).getValue(dc);if (value.toString().contains(">") || value.toString().contains("<") || value.toString().contains("&")|| value.toString().contains("'") || value.toString().contains("\"")) {value = value.toString().replace(">", "&gt;");value = value.toString().replace("<", "&lt;");value = value.toString().replace("&", "&amp;");value = value.toString().replace("'", "&apos;");value = value.toString().replace("\"", "&quot;");}str.append(value);} catch (Exception e) {}str.append("</");str.append(dc.ColumnName);str.append(">");}str.append("</");str.append(dt.getTableName());str.append(">");}}// }str.append("</NewDataSet>");String temp = str.toString();int pathType=0;if(path.startsWith("resources")==true)pathType = 1;if(SystemConfig.getIsJarRun() && pathType==1){}// 写入文件File file = new File(path);try {if (!file.exists()) {file.createNewFile();}FileOutputStream fos = new FileOutputStream(file);OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");BufferedWriter br = new BufferedWriter(osw);br.write(temp.toString());fos.flush();br.close();fos.close();osw.close();} catch (IOException e) {e.printStackTrace();}}public String formatXml(String str) throws Exception {Document document = null;document = DocumentHelper.parseText(str);// 格式化输出格式OutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("gbk");StringWriter writer = new StringWriter();// 格式化输出流XMLWriter xmlWriter = new XMLWriter(writer, format);// 将document写入到输出流xmlWriter.write(document);xmlWriter.close();return writer.toString();}public void readXmls(String xmlPath) throws Exception {if (DataType.IsNullOrEmpty(xmlPath)) {return;}SAXReader reader = new SAXReader();File file = new File(xmlPath);// DataSet ds=new DataSet();if (file.exists()) {Document document = reader.read(file);// 读取XML文件Element root = document.getRootElement();// 得到根节点for (Iterator i = root.elementIterator(); i.hasNext();) {Element e = (Element) i.next();boolean type = false;for (int k = 0; k < this.Tables.size(); k++) {if (this.Tables.get(k).TableName.equals(e.getName())) {DataTable dt = this.Tables.get(k);DataRow dr = dt.NewRow();DataColumn dc = null;for (Iterator j = e.elementIterator(); j.hasNext();) {Element cn = (Element) j.next();dc = new DataColumn(cn.getName());dr.setValue(dc, cn.getText());}dt.Columns.Add(dc);dt.Rows.add(dr);type = true;break;}}if (type) {continue;}DataTable dt = new DataTable(e.getName());DataRow dr = dt.NewRow();DataColumn dc = null;for (Iterator j = e.elementIterator(); j.hasNext();) {Element cn = (Element) j.next();dc = new DataColumn(cn.getName());dt.Columns.Add(dc);dr.setValue(dc, cn.getText());}dt.Rows.add(dr);this.Tables.add(dt);this.hashTables.put(e.getName(), dt);}}}public void readXmlm(String xml) {if (DataType.IsNullOrEmpty(xml))return;try {xml = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\r\n <NewDataSets>" + xml + "</NewDataSets>";// 创建xml解析对象SAXReader reader = new SAXReader();// 定义一个文档Document document = null;// 将字符串转换为document = reader.read(new ByteArrayInputStream(xml.getBytes("UTF-8")));@SuppressWarnings("unchecked")List<Element> elements = document.selectNodes("//NewDataSets/NewDataSet");int i = 0;DataTable oratb = new DataTable();for (Element element : elements) {DataRow dr = oratb.NewRow();@SuppressWarnings("unchecked")Iterator<Element> iter = element.elementIterator();int j = 0;while (iter.hasNext()) {Element itemEle = (Element) iter.next();if (i == 0) {oratb.Columns.Add(itemEle.getName());}dr.setValue(j, itemEle.getTextTrim());j++;}oratb.Rows.add(dr);i++;}this.Tables.add(oratb);} catch (Exception e) {e.printStackTrace();}}public String getName() {return name;}public void setName(String name) throws Exception {this.setName( name);}public List<DataTable> getTables() {return Tables;}public void setTables(List<DataTable> tables) {Tables = tables;}public Hashtable<String, DataTable> getHashTabless() {return hashTables;}public void setHashTables(Hashtable<String, DataTable> hashTables) {this.hashTables = hashTables;}/*** 获取文件的XML文件内容。* param path xml文件路径* @return xml文件内容*/public String xmlToString(String path) throws Exception {String line = null;StringBuffer strBuffer = new StringBuffer();int pathType =0;if((path.indexOf("DataUser/")!=-1 &&path.indexOf("DataUser/Siganture/")==-1 && path.indexOf("DataUser/UploadFile/")==-1 &&path.indexOf("DataUser/FlowDesc/")==-1 && path.indexOf("DataUser/Temp/")==-1 )|| path.indexOf("WF/")!=-1)pathType =1;try {String encoding = "UTF-8"; // 字符编码if(SystemConfig.getIsJarRun() && pathType==1){ClassPathResource classPathResource = new ClassPathResource(path);InputStream inputStream = classPathResource.getInputStream();StringBuilder stringBuilder = new StringBuilder();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, encoding));StringBuffer buffer = new StringBuffer();while ((line = bufferedReader.readLine()) != null){buffer.append(line + "\n");}bufferedReader.close();return buffer.toString();}else{File file = new File(path);if (file.isFile() && file.exists()) {InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);BufferedReader bufferedReader = new BufferedReader(read);while ((line = bufferedReader.readLine()) != null) {strBuffer.append(line + "\n");}read.close();} else {throw new Exception("找不到指定的文件"+path+",请联系管理员查看环境配置是否正确,jflow.properties中的配置是否正确");}}} catch (Exception e) {throw new Exception("读取文件内容操作出错!" + e.getMessage());}return strBuffer.toString();}/*** 读取XML文件* param xmlpath xml文件路径* @author ThinkGem*/@SuppressWarnings("rawtypes")public void readXml(String xmlpath) {if (DataType.IsNullOrEmpty(xmlpath)){return;}try {String xml = xmlToString(xmlpath);Document document = new SAXReader().read(new ByteArrayInputStream(xml.getBytes("UTF-8")));Element element = document.getRootElement();// 遍历 DataTablefor (Iterator iterator = element.elementIterator(); iterator.hasNext();) {Element el = (Element) iterator.next();
//				System.out.println(" ===================== " + el.getName());// 如果没有获取到DataTable则新建一个DataTable dt = hashTables.get(el.getName());if (dt == null){dt = new DataTable(el.getName());hashTables.put(el.getName(), dt);Tables.add(dt);}// 新增一行数据DataRow dr = dt.NewRow();dt.Rows.add(dr);// 遍历该DataTable的属性for (Iterator it = el.attributeIterator(); it.hasNext();) {Attribute at = (Attribute)it.next();
//					System.out.println(" ======= " + at.getName());//sunxd 修改//由于"at.getName().toLowerCase()"语句导至  isContains 方法判断永远不成立,会给TABLE插入很多重复列//将at.getName().toLowerCase() 修改为  at.getName()if (!iscontains(dt.Columns.subList(0, dt.Columns.size()), at.getName())) {dt.Columns.Add(at.getName());}dr.setValue(at.getName(), at.getValue());}// 遍历该DataTable的子元素for (Iterator it = el.elementIterator(); it.hasNext();) {Element at = (Element) it.next();if (!iscontains(dt.Columns.subList(0, dt.Columns.size()), at.getName())) {dt.Columns.Add(at.getName());}String value = at.getText();try {//导出模板进行了转义,现在进行反转 dgq 2018-7-5if (value.toString().contains("&gt;") || value.toString().contains("&lt;")|| value.toString().contains("&amp;") || value.toString().contains("&apos;")|| value.toString().contains("&quot;")) {value = value.toString().replace("&amp;", "&");value = value.toString().replace("&gt;",">");value = value.toString().replace("&lt;","<");value = value.toString().replace("&apos;","'");value = value.toString().replace("&quot;","\"");}} catch (Exception e) {}dr.setValue(at.getName(), value);}}} catch (Exception e) {e.printStackTrace();}}public boolean iscontains(List<DataColumn> dcList, String column) {for (DataColumn dc : dcList) {if (dc.ColumnName.equals(column)) {return true;}}return false;}public static String ConvertDataSetToXml(DataSet dataSet) {if (dataSet != null) {String str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";str += "<xs:schema id=\"NewDataSet\" xmlns=\"\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\" xmlns:msdata=\"urn:schemas-microsoft-com:xml-msdata\">";str += "<xs:element name=\"NewDataSet\" msdata:IsDataSet=\"true\" msdata:UseCurrentLocale=\"true\">";str += "<xs:complexType><xs:choice minOccurs=\"0\" maxOccurs=\"unbounded\">";// 循环每一个表的列for (int n = 0; n < dataSet.getTables().size(); n++) {str += "<xs:element name=\"" + dataSet.getTables().get(n).TableName + "\">";str += "<xs:complexType><xs:sequence>";DataTable table = dataSet.getTables().get(n);for (DataColumn col : table.Columns) {str += "<xs:element name=\"" + col.ColumnName;str += "\" type=\"";try {col.DataType.toString();str += IsType(col.DataType.toString());} catch (Exception e) {str += "xs:string";}str += "\" minOccurs=\"0\" />";}str += "</xs:sequence></xs:complexType></xs:element>";}str += "</xs:choice></xs:complexType></xs:element><_NewDataSet>";for (int i = 0; i < dataSet.getTables().size(); i++) {DataTable dt = dataSet.getTables().get(i);DataTable table = dataSet.getTables().get(i);for (int j = 0; j < table.Rows.size(); j++) {str += "<_" + i + ">";DataRow row = table.Rows.get(j);for (int a = 0; a < row.columns.size(); a++) {DataColumn col = table.Columns.get(a);str += "<_" + a + ">";if (row.getValue(col) == null) {str += "";} else {if (col.ColumnName.equals("icon")) {if (row.getValue(col).equals("")) {str += "审核";} else if (row.getValue(col).equals("Default")) {str += "审核";} else {str += row.getValue(col);}} else {str += row.getValue(col);}}str += "</_" + a + ">";}str += "</_" + i + ">";}}str += "</_NewDataSet>";str += "</xs:schema>";return str;}return null;}public static String IsType(String name) throws Exception {if (name.equals("class java.lang.Integer")) {name = "xs:int";}if (name.equals("class java.lang.Long")) {name = "xs:long";}if (name.equals("class java.lang.Float")) {name = "xs:float";}if (name.equals("class java.lang.Double")) {name = "xs:double";}if (name.equals("class java.lang.String")) {name = "xs:string";}if (name.equals("class java.math.BigDecimal")) {name = "xs:int";}return name;}}
package bp.da;import bp.difference.SystemConfig;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import org.springframework.core.io.ClassPathResource;import java.io.*;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;public class DataTable implements Cloneable
{/*** 保存DataRow的集合,在DataTable初始化時,便會建立*/public DataRowCollection Rows;/*** 保存DataColumn的集合,在DataTable初始化時,便會建立*/public DataColumnCollection Columns;/*** DataTable的名稱,沒什麼用到*/public String TableName;private DataRow[] dataRows;/*** @return 复制DataTable的结构*/public DataTable clone(){try{DataTable v = new DataTable();for(DataColumn Column: this.Columns){v.Columns.Add(Column.ColumnName,Column.DataType);}return v;} catch (Exception e){throw new InternalError();}}/*** @return 复制DataTable的结构与数据。* @throws CloneNotSupportedException*/public DataTable copy(){try{DataTable v = (DataTable) super.clone();v.Rows = (DataRowCollection) this.Rows.clone();v.Columns = (DataColumnCollection) this.Columns.clone();return v;} catch (CloneNotSupportedException e){throw new InternalError();}}/*** 初始化DataTable,並建立DataColumnCollection,DataRowCollection*/public DataTable()  {this.Columns = new DataColumnCollection(this);this.Rows = new DataRowCollection(this);}/*** 除了初始化DataTable, 可以指定DataTable的名字(沒什麼意義)** param tableName DataTable的名字*/public DataTable(String tableName)  {this();this.TableName = tableName;}/*** 由此DataTable物件來建立一個DataRow物件** @return DataRow*/public DataRow NewRow(){DataRow row = new DataRow(this);// DataRow為呼叫此方法DataTable的成員return row;}/*** 把DataTable當做二維陣列,給列索引和行索引,設定值的方法 <br/>* (發佈者自行寫的方法)** param rowIndex*            列索引(從0算起)* param columnIndex*            行索引(從0算起)* param value*            要給的值*/public void setValue(int rowIndex, int columnIndex, Object value)throws Exception{this.Rows.get(rowIndex).setValue(columnIndex, value);}/*** 把DataTable當做二維陣列,給列索引和行名稱,設定值的方法 <br/>* (發佈者自行寫的方法)** param rowIndex 列索引(從0算起)* param columnName 行名稱* param value 要給的值*/public void setValue(int rowIndex, String columnName, Object value)throws Exception{this.Rows.get(rowIndex).setValue(columnName.toLowerCase(), value);}/*** 把DataTable當做二維陣列,給列索引和行索引,取得值的方法 <br/>* (發佈者自行寫的方法)** param rowIndex*            列索引(從0算起)* param columnIndex*            行索引(從0算起)* @return 回傳該位置的值*/public Object getValue(int rowIndex, int columnIndex){return this.Rows.get(rowIndex).getValue(columnIndex);}public void Clear(){Rows.clear();Columns.clear();}public void ClearRow()throws Exception{Rows.clear();}public List<DataRow> Select(Map<String, Object> filterMap) throws Exception {List<DataRow> dataRowList = new ArrayList<DataRow>();outer: for (int i = 0; i < Rows.size(); i++){DataRow row = Rows.get(i);for (Object key : filterMap.keySet().toArray()){Object lefteql = filterMap.get(key);Object righteql = row.getValue(key.toString());if (lefteql == null || "".equals(lefteql)){if (righteql == null || "".equals(righteql)){continue;} else{continue outer;}} else if (!filterMap.get(key).toString().toUpperCase().equals(row.getValue(key.toString()).toString().toUpperCase())){continue outer;}}dataRowList.add(row);}return dataRowList;}/*** 返回符合过滤条件的数据行集合,并返回* param filterString 过滤字符串,例如  a>1 and a>=2 or a<3 and a<=4 or a!=5 and a=6 or a!='b' and a='c'* @return 过滤后的 List<DataRow>*/public List<DataRow> select(String filterString) {List<DataRow> rows = new ArrayList<DataRow>();if (DataType.IsNullOrEmpty(filterString) == true)return this.Rows;boolean bl;for (Object row : this.Rows) {DataRow currentRow = (DataRow) row;try {bl = dataRowCompute(filterString, currentRow);} catch (Exception e) {System.err.println("语法错误");e.printStackTrace();continue;}if (bl) {rows.add(currentRow);}}return rows;}/*** 返回符合过滤条件的数据行集合,并返回* param filterString 过滤字符串,例如  a>1 and a>=2 or a<3 and a<=4 or a!=5 and a=6 or a!='b' and a='c'* @return 过滤后的 List<DataRow>*/public List<DataRow> selectx(String filterString) {List<DataRow> rows = new ArrayList<DataRow>();if (DataType.IsNullOrEmpty(filterString) == true)return rows;boolean bl = false;for (Object row : Rows) {DataRow currentRow = (DataRow) row;try {//bl = dataRowCompute(filterString, currentRow);if(filterString.split("=").length>1)bl = currentRow.getValue(filterString.split("=")[0].trim()).equals(filterString.split("=")[1].trim());} catch (Exception e) {System.err.println("语法错误");e.printStackTrace();continue;}if (bl) {rows.add(currentRow);}}return rows;}/*** 数据行计算,是否符合filterString过滤条件* param filterString 过滤条件,支持  and or > >= < <= != = 操作符,暂不支持括号* param row 数据行* @return true 符合*/private boolean dataRowCompute(String filterString, DataRow row){if (filterString == null || row == null){return false;}boolean orResult = false;try {String[] or = filterString.split(" (?i)or ");	// 忽略大小写for (String o : or){boolean andResult = true;String[] and = o.split(" (?i)and ");	// 忽略大小写for (String a : and){String[] kv = null;if (a.contains(">=")){kv = a.split(">=");}else if (a.contains(">")){kv = a.split(">");}else if (a.contains("<=")){kv = a.split("<=");}else if (a.contains("<")){kv = a.split("<");}else if (a.contains("!=")){kv = a.split("!=");}else if (a.contains("=")){kv = a.split("=");}if (kv != null && kv.length == 2){String key = kv[0].trim(), value = kv[1].trim();if (key != null && value != null){Object val = row.getValue(key);// is nullif (value.equalsIgnoreCase("is null")){if (!(val == null)){andResult = false;break;}}// is not nullelse if (value.equalsIgnoreCase("is not null")){if (!(val != null)){andResult = false;break;}}// is stringelse if (value.startsWith("'") && value.endsWith("'")){String v = value.replaceAll("'", "");if (a.contains("!=")){if (!(!val.toString().equalsIgnoreCase(v))){andResult = false;break;}}else if (a.contains("=")){if (!(val.toString().equalsIgnoreCase(v))){andResult = false;break;}}}// is numberelse{int v =  Integer.parseInt(value.toString());int dbVal = Integer.parseInt(val.toString());if (a.contains(">=")){if (!(dbVal >= v)){andResult = false;break;}}else if (a.contains(">")){if (!(dbVal > v)){andResult = false;break;}}else if (a.contains("<=")){if (!(dbVal <= v)){andResult = false;break;}}else if (a.contains("<")){if (!(dbVal < v)){andResult = false;break;}}else if (a.contains("!=")){if (!(dbVal != v)){andResult = false;break;}}else if (a.contains("=")){if (!(dbVal == v)){andResult = false;break;}}}}}}// 如果有一个and成立,则成立。if (andResult){orResult = true;break;}}} catch (Exception e) {System.err.println("语法错误");e.printStackTrace();}return orResult;}public String getTableName() {return TableName;}public void setTableName(String tableName) {TableName = tableName;}/*** 把DataTable當做二維陣列,給列索引和行名稱,取得值的方法 <br/>* (發佈者自行寫的方法)** param rowIndex 列索引(從0算起)* param columnName 行名稱* @return 回傳該位置的值*/public Object getValue(int rowIndex, String columnName){return this.Rows.get(rowIndex).getValue(columnName);}public DataRow[] Select(String string) {DataRow[] dataRowsx = null;List<DataRow> dataRowList = new ArrayList<DataRow>();if (DataType.IsNullOrEmpty(string)==false) {boolean bl;for (Object row : Rows) {DataRow currentRow = (DataRow) row;try {bl = dataRowCompute(string, currentRow);} catch (Exception e) {System.err.println("语法错误");e.printStackTrace();continue;}if (bl) {dataRowList.add(currentRow);}}dataRowsx = new DataRow[dataRowList.size()];for(int i=0;i<dataRowList.size();i++){dataRowsx[i] = dataRowList.get(i);}return dataRowsx;} else {return dataRowsx;}}public void WriteXml(String path, DataTable dt) {StringBuilder str = new StringBuilder("<?xml version=\"1.0\" standalone=\"yes\"?>");str.append("<DataTable>");for (int k = 0; k < dt.Rows.size(); k++) {str.append("<");str.append(dt.getTableName());str.append(">");for (int j = 0; j < dt.Columns.size(); j++) {DataColumn dc = dt.Columns.get(j);str.append("<");str.append(dc.ColumnName);str.append(">");try {Object value = dt.Rows.get(k).getValue(dc);if (value.toString().contains(">") || value.toString().contains("<") || value.toString().contains("&")|| value.toString().contains("'") || value.toString().contains("\"")) {value = value.toString().replace(">", "&gt;");value = value.toString().replace("<", "&lt;");value = value.toString().replace("&", "&amp;");value = value.toString().replace("'", "&apos;");value = value.toString().replace("\"", "&quot;");}str.append(value);} catch (Exception e) {}str.append("</");str.append(dc.ColumnName);str.append(">");}str.append("</");str.append(dt.getTableName());str.append(">");}str.append("</DataTable>");// }String temp = str.toString();// String temp = formatXml(str.toString());// 写入文件File file = new File(path);try {if (!file.exists()) {file.createNewFile();}FileOutputStream fos = new FileOutputStream(file);OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");BufferedWriter br = new BufferedWriter(osw);br.write(temp.toString());fos.flush();br.close();fos.close();osw.close();} catch (IOException e) {e.printStackTrace();}}/*** 获取文件的XML文件内容。* param path xml文件路径* @return xml文件内容*/public String xmlToString(String path) throws Exception {String line = null;StringBuffer strBuffer = new StringBuffer();int pathType =0;if(path.indexOf("DataUser/")!=-1 || path.indexOf("WF/")!=-1)pathType =1;try {String encoding = "UTF-8"; // 字符编码if(SystemConfig.getIsJarRun() && pathType==1){ClassPathResource classPathResource = new ClassPathResource(path);InputStream inputStream = classPathResource.getInputStream();StringBuilder stringBuilder = new StringBuilder();BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, encoding));StringBuffer buffer = new StringBuffer();while ((line = bufferedReader.readLine()) != null){buffer.append(line + "\n");}bufferedReader.close();return buffer.toString();}else{File file = new File(path);if (file.isFile() && file.exists()) {InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);BufferedReader bufferedReader = new BufferedReader(read);while ((line = bufferedReader.readLine()) != null) {strBuffer.append(line + "\n");}read.close();} else {throw new Exception("找不到指定的文件"+path+",请联系管理员查看环境配置是否正确,jflow.properties中的配置是否正确");}}} catch (Exception e) {throw new Exception("读取文件内容操作出错!" + e.getMessage());}return strBuffer.toString();}public boolean iscontains(List<DataColumn> dcList, String column) {for (DataColumn dc : dcList) {if (dc.ColumnName.equals(column)) {return true;}}return false;}/*** 读取XML文件* param xmlpath xml文件路径* @author ThinkGem*/@SuppressWarnings("rawtypes")public DataTable readXml(String xmlpath) {if (DataType.IsNullOrEmpty(xmlpath)){return null;}try {String xml = xmlToString(xmlpath);Document document = new SAXReader().read(new ByteArrayInputStream(xml.getBytes("UTF-8")));Element root = document.getRootElement();DataTable dt = new DataTable(root.getName());DataRow dr = null;for (Iterator i = root.elementIterator(); i.hasNext();){Element element = (Element) i.next();dr = dt.NewRow();// 遍历该DataTable的属性for (Iterator it = element.attributeIterator(); it.hasNext();) {Attribute at = (Attribute)it.next();
//					System.out.println(" ======= " + at.getName());//sunxd 修改//由于"at.getName().toLowerCase()"语句导至  isContains 方法判断永远不成立,会给TABLE插入很多重复列//将at.getName().toLowerCase() 修改为  at.getName()if (!iscontains(dt.Columns.subList(0, dt.Columns.size()), at.getName())) {dt.Columns.Add(at.getName());}dr.setValue(at.getName(), at.getValue());}// 遍历该DataTable的子元素for (Iterator it = element.elementIterator(); it.hasNext();) {Element at = (Element) it.next();if (!iscontains(dt.Columns.subList(0, dt.Columns.size()), at.getName())) {dt.Columns.Add(at.getName());}String value = at.getText();try {//导出模板进行了转义,现在进行反转 dgq 2018-7-5if (value.toString().contains("&gt;") || value.toString().contains("&lt;")|| value.toString().contains("&amp;") || value.toString().contains("&apos;")|| value.toString().contains("&quot;")) {value = value.toString().replace("&amp;", "&");value = value.toString().replace("&gt;",">");value = value.toString().replace("&lt;","<");value = value.toString().replace("&apos;","'");value = value.toString().replace("&quot;","\"");}} catch (Exception e) {}dr.setValue(at.getName(), value);}dt.Rows.add(dr);}return dt;} catch (Exception e) {e.printStackTrace();}return null;}}

DataTable

参考资料和推荐阅读

  1. 暂无

欢迎阅读,各位老铁,如果对你有帮助,点个赞加个关注呗!~
如有侵权,请联系删除之


http://chatgpt.dhexx.cn/article/tUBGKOYJ.shtml

相关文章

推荐一款源代码统计分析、开发工作量估算、测试缺陷预测的开发工具 —— 代码统计分析工具(SourceCounter)

目录 一、软件简介 二、主要功能 三、更新日志 四、关键字 一、软件简介 代码统计分析工具 4.0&#xff0c;支持 30多种代码格式。能够统计包括&#xff1a;代码行数、注释、空行、文件大小等数据。另外&#xff0c;还支持对软件开发项目的各个开发阶段的工数、成本、质量…

恶意代码分析——基础技术篇

文章目录 恶意代码分析目的恶意代码分析方法恶意代码种类恶意代码静态分析环境在线反病毒引擎获取哈希值&#xff08;certutil-hanshfile path MD5&#xff09;查找字符串hive string ida火绒剑加壳&查壳文件加壳使用PEiD检测加壳 导入导出函数获取资源信息 常见的DLL程序恶…

Understand(代码分析工具)的安装与使用教程

前言 虽然自己一直都在CSDN上面学习相关知识和查找需要的各种资源&#xff0c;但或许是因为自己实在不知道自己的博客该写什么内容&#xff0c;于是博客的更新速度一慢再慢&#xff0c;进而停更一年左右&#xff0c;在这一点上&#xff0c;我认为自己应该作出批评与反省。 而…

如何看懂源代码--(分析源代码方法)

我们在写程序时&#xff0c;有不少时间都是在看别人的代码。 例如看小组的代码&#xff0c;看小组整合的守则&#xff0c;若一开始没规划怎么看&#xff0c; 就会“看得想哭 ” 不管是参考也好&#xff0c;从开源抓下来研究也好&#xff0c;为了了解箇中含意&#xff0c;在有限…

一文了解全面静态代码分析

在开发具有安全性、可靠性和合规性的软件时&#xff0c;全面静态代码分析是一种有效的方法。在这里&#xff0c;我们将就静态分析而言&#xff0c;讨论全面静态代码分析的不同之处&#xff0c;阐述全面静态代码分析的重要性&#xff0c;以及如何进行全面静态代码分析。 什么是全…

代码分析工具 - SonarQube

1. 常见代码质量分析工具 SonarQube&#xff1a;可以分析27多种不同编程语言中的代码&#xff0c;并帮助您提高性能和检测安全漏洞。它由SonarSource的团队开发&#xff0c;对社区免费开源。SonarQube可以添加到您的CI/CD管道中&#xff0c;或者与您选择的代码库托管平台集成&a…

《编码 - 代码分析》代码结构分析

1 代码结构分析概述 在编写代码时&#xff0c;要求要结构清晰、接口简单。如果代码结构过于复杂&#xff0c;会带来很多问题&#xff1a;代码很难被理解&#xff0c;不方便编写测试用例&#xff0c;容易隐藏错误&#xff0c;出现问题难以定位&#xff0c;修改代码容易产生新的…

利用宏让ERStudio生成代码文件

Embarcadero ERStudio 是一个数据模型工具&#xff0c;用起来很方便。在ERStudio里建完数据模型后&#xff0c;可以利用宏来帮助生成对应的实体类文件以及对应的简单的数据访问类文件。为了实现这一目的&#xff0c;需要自己写脚本&#xff0c;支持的语言为 VB&#xff08;以前…

Erstudio8.0怎么用?Erstudio8.0汉化版详细使用教程

Erstudio8.0使用教程 打开ERstudio,点击新建出现如图对话框&#xff1a; 选择第一个&#xff0c;表示创建一个新的关系型 数据库模型 这里提一点数据库模型分为relational(关系)和dimensional(多维) 两种在这里主要以关系型数据库为主来介绍模型的创建过程。 第二和第三项均是重…

ERStudio如何显示entity的tableName(表名的英文)和defaultColumnName(英文字段名)

转换为物理模型就可以了 物理模型中会优先显示tableName和defaultColumnName 这个mysql选择自己使用的数据库即可&#xff0c; ** 温馨提示&#xff1a;只想单纯看一下英文名而且不会转物理模型的话可以参考我的这个步骤&#xff0c;专业转化物理模型的话&#xff0c;建议另…

【SpringBoot】4. ERStudio初使用

1. 逻辑结构 &#xff08;1&#xff09;创建文件 &#xff08;2&#xff09;建立实体对象entity &#xff08;3&#xff09;编辑实体对象 &#xff08;4&#xff09;添加属性 &#xff08;5&#xff09;图表显示选项 &#xff08;6&#xff09;实体之间建立联系 &#xff08;7…

如何使用ERStudio 生成comment

在ER使用中&#xff0c;在生成sql过程中&#xff0c;如何批量生成字段描述&#xff0c;如何批量添加Owner&#xff0c;请看下文&#xff1a; 1、ER生成字段描述 2、ER生成描述添加Owner 使用的ER版本是8.0&#xff0c;英文版本&#xff0c;在操作过程中&#xff0c;有些配置细节…

使用ERStudio6创建数据表ER图并导出数据表的SQL(DDL)语句

1.创建数据表实体 打开ERStudio软件&#xff0c;其界面如下&#xff1a; 点击File菜单的NEW或则使用快捷键“CtrlN”着按钮 来新建一个ER图文件&#xff0c;按下OK按钮即可打开一个空白的ER图文件 其后缀是.DM1类型的。新建一个ER文件后&#xff0c;ERStudio的工具栏内的许多按…

ER/Studio知识汇总

一、关系 网上找了一下&#xff0c;大部分说得不太清楚&#xff0c;我在这里举上个例子。注意&#xff0c;这里的关系是逻辑上的&#xff0c;并非表结构也要如此。 1. 标识关系identifying relationship 意思&#xff1a;子实体的主键包含父实体的外键&#xff08;可能成为复合…

【NodeJS】20 koa 企业级Cms内容管理系统-XMind功能分析、ERStudio设计数据库ER图

一、 什么是 CMS CMS 是"Content Management System“的缩写&#xff0c;意为"内容管理系统”。 内容管理系统是企业信息化建设和电子政务的新宠&#xff0c;也是一个相对较新的市场。对于内容管理&#xff0c;业界还没有一个统一的定义&#xff0c;不同的机构有不同…

ER-studio显示选项设置

新建erstudio文件&#xff0c;默认不显示entity的datatype&#xff0c;用起来不方便。 设置如下&#xff1a; 当前页面->右键选择 Diagram And object Display Options->Entity->Datatype(勾选即可)。效果如上图

(10)ERStudio

1.外键 https://jingyan.baidu.com/article/f79b7cb37e9d219144023ea6.html 第一个图标&#xff1a;Identifying Relationship。 一对多的关联&#xff0c;主表的主键既是子表的外键也是子表的主键 第二个图标&#xff1a;Non-Identifying, Mandatory Relationship。 一对多的关…

ERStudio逆向工程生成ER模型

首先&#xff0c;打开ERStudio&#xff0c;如下图所示&#xff1a; 然后&#xff0c;点击菜单栏上的“File”——“New”&#xff0c;如下图所示&#xff1a; 弹出如下的对话框&#xff0c;选择第二个单选按钮 接着&#xff0c;点击“Login”按钮&#xff0c;弹出如下的对话框&…

使用ERStudio创建数据表与ER图

下面以一个教育网站的用户数据表来举例说明ERStudio的一些基本操作方法&#xff1a; 1.创建数据表实体 打开ERStudio软件&#xff0c;其界面如下&#xff1a; 点击File菜单的NEW或则使用快捷键“CtrlN”着按钮来新建一个ER图文件&#xff0c;按下OK按钮即可打开一个空白的ER图文…

使用ERStudio创建数据表ER图并导出数据表的SQL(DDL)语句

1.创建数据表实体 打开ERStudio软件,其界面如下: 点击File菜单的NEW或则使用快捷键“Ctrl+N”着按钮来新建一个ER图文件,按下OK按钮即可打开一个空白的ER图文件 其后缀是.DM1类型的。新建一个ER文件后,ERStudio的工具栏内的许多按钮从灰色编程了彩色可用。 下面开始创建一个…