// 合并时间范围内的多个XML文件 public int MergeXmlFiles( string strLibraryCodeList, ref int nStop, string strDateRangeString, string strStyle, string strOutputFilename, out RangeStatisInfo info, out string strError) { strError = ""; int nRet = 0; File.Delete(strOutputFilename); info = new RangeStatisInfo(); string strStartDate = ""; string strEndDate = ""; try { // 将日期字符串解析为起止范围日期 // throw: // Exception ParseDateRange(strDateRangeString, out strStartDate, out strEndDate); } catch (Exception ex) { strError = ex.Message; return -1; } info.StartDate = strStartDate; info.EndDate = strEndDate; DateTime start; DateTime end; start = DateTimeUtil.Long8ToDateTime(strStartDate); if (strEndDate == "") { end = start; info.EndDate = strStartDate; } else { end = DateTimeUtil.Long8ToDateTime(strEndDate); TimeSpan delta = end - start; if (delta.Days < 0) { // 交换两个时间 DateTime temp = end; end = start; start = temp; } } int nCount = 0; // 实际存在多少天 DateTime current = start; for (; ; ) { if (nStop != 0) { strError = "用户中断"; return -1; } string strDate = DateTimeUtil.DateTimeToString8(current); string strFilename = this.StatisDir + "\\" + strDate + ".xml"; info.Days++; if (File.Exists(strFilename) == true) { // 首个文件 if (nCount == 0) { if (SessionInfo.IsGlobalUser(strLibraryCodeList) == true) { // 如果是全局用户,直接复制第一个文件 try { File.Copy(strFilename, strOutputFilename, true); } catch (Exception ex) { // text-level: 内部错误 strError = "复制首个文件 " + strFilename + "到目标文件 " + strOutputFilename + "时发生错误: " + ex.Message; return -1; } } else { // 如果是分馆用户,则要对第一个文件进行过滤处理,去掉不相干的那些<library>元素 XmlDocument dom = new XmlDocument(); try { dom.Load(strFilename); } catch (Exception ex) { strError = "装载首个文件 '" + strFilename + "' 到XMLDOM时出错: " + ex.Message; return -1; } XmlNodeList nodes = dom.DocumentElement.SelectNodes("library"); foreach (XmlNode node in nodes) { string strCode = DomUtil.GetAttr(node, "code"); if (StringUtil.IsInList(strCode, strLibraryCodeList) == false) node.ParentNode.RemoveChild(node); } try { dom.Save(strOutputFilename); } catch (Exception ex) { strError = "保存XMLDOM到文件 '" + strOutputFilename + "' 时出错: " + ex.Message; return -1; } } info.RealStartDate = DateTimeUtil.DateTimeToString8(current); info.RealEndDate = DateTimeUtil.DateTimeToString8(current); } else { // 合并两个XML文件到目标文件 nRet = MergeTwoXmlFiles( strLibraryCodeList, strFilename, strOutputFilename, strOutputFilename, out strError); if (nRet == -1) return -1; info.RealEndDate = DateTimeUtil.DateTimeToString8(current); } nCount++; info.RealDays++; } if (current >= end) break; current = current.AddDays(1); } return 0; }
// 合并时间范围内的多个XML文件 public int MergeXmlFiles( string strLibraryCodeList, ref int nStop, string strDateRangeString, string strStyle, string strOutputFilename, out RangeStatisInfo info, out string strError) { strError = ""; int nRet = 0; File.Delete(strOutputFilename); info = new RangeStatisInfo(); string strStartDate = ""; string strEndDate = ""; try { // 将日期字符串解析为起止范围日期 // throw: // Exception ParseDateRange(strDateRangeString, out strStartDate, out strEndDate); } catch (Exception ex) { strError = ex.Message; return(-1); } info.StartDate = strStartDate; info.EndDate = strEndDate; DateTime start; DateTime end; start = DateTimeUtil.Long8ToDateTime(strStartDate); if (strEndDate == "") { end = start; info.EndDate = strStartDate; } else { end = DateTimeUtil.Long8ToDateTime(strEndDate); TimeSpan delta = end - start; if (delta.Days < 0) { // 交换两个时间 DateTime temp = end; end = start; start = temp; } } int nCount = 0; // 实际存在多少天 DateTime current = start; for (; ;) { if (nStop != 0) { strError = "用户中断"; return(-1); } string strDate = DateTimeUtil.DateTimeToString8(current); string strFilename = this.StatisDir + "\\" + strDate + ".xml"; info.Days++; if (File.Exists(strFilename) == true) { // 首个文件 if (nCount == 0) { if (SessionInfo.IsGlobalUser(strLibraryCodeList) == true) { // 如果是全局用户,直接复制第一个文件 try { File.Copy(strFilename, strOutputFilename, true); } catch (Exception ex) { // text-level: 内部错误 strError = "复制首个文件 " + strFilename + "到目标文件 " + strOutputFilename + "时发生错误: " + ex.Message; return(-1); } } else { // 如果是分馆用户,则要对第一个文件进行过滤处理,去掉不相干的那些<library>元素 XmlDocument dom = new XmlDocument(); try { dom.Load(strFilename); } catch (Exception ex) { strError = "装载首个文件 '" + strFilename + "' 到XMLDOM时出错: " + ex.Message; return(-1); } XmlNodeList nodes = dom.DocumentElement.SelectNodes("library"); foreach (XmlNode node in nodes) { string strCode = DomUtil.GetAttr(node, "code"); if (StringUtil.IsInList(strCode, strLibraryCodeList) == false) { node.ParentNode.RemoveChild(node); } } try { dom.Save(strOutputFilename); } catch (Exception ex) { strError = "保存XMLDOM到文件 '" + strOutputFilename + "' 时出错: " + ex.Message; return(-1); } } info.RealStartDate = DateTimeUtil.DateTimeToString8(current); info.RealEndDate = DateTimeUtil.DateTimeToString8(current); } else { // 合并两个XML文件到目标文件 nRet = MergeTwoXmlFiles( strLibraryCodeList, strFilename, strOutputFilename, strOutputFilename, out strError); if (nRet == -1) { return(-1); } info.RealEndDate = DateTimeUtil.DateTimeToString8(current); } nCount++; info.RealDays++; } if (current >= end) { break; } current = current.AddDays(1); } return(0); }
// 合并时间范围内的多个XML文件 // parameters: // strLibraryCodeList 馆代码列表。用来筛选 XML 文件中的分馆节点。如果想获得所有分馆的统计信息,那就需要用 "" 作为参数值 public int MergeXmlFiles( string strLibraryCodeList, ref int nStop, string strDateRangeString, string strStyle, string strOutputFilename, out RangeStatisInfo info, out string strError) { strError = ""; int nRet = 0; File.Delete(strOutputFilename); ValueStyle valuestyle = ValueStyle.None; if (StringUtil.IsInList("list", strStyle) == true) valuestyle = ValueStyle.Total | ValueStyle.List; else valuestyle = ValueStyle.Total; info = new RangeStatisInfo(); string strStartDate = ""; string strEndDate = ""; try { // 将日期字符串解析为起止范围日期 // throw: // Exception ParseDateRange(strDateRangeString, out strStartDate, out strEndDate); } catch (Exception ex) { strError = ExceptionUtil.GetAutoText(ex); return -1; } info.StartDate = strStartDate; info.EndDate = strEndDate; DateTime start; DateTime end; try { start = DateTimeUtil.Long8ToDateTime(strStartDate); } catch (Exception ex) { strError = "日期字符串 '" + strDateRangeString + "' 格式错误: " + ex.Message; return -1; } if (strEndDate == "") { end = start; info.EndDate = strStartDate; } else { try { end = DateTimeUtil.Long8ToDateTime(strEndDate); } catch (Exception ex) { strError = "日期字符串 '" + strDateRangeString + "' 格式错误: " + ex.Message; return -1; } TimeSpan delta = end - start; if (delta.Days < 0) { // 交换两个时间 DateTime temp = end; end = start; start = temp; } } Hashtable valuetable = new Hashtable(); int nCount = 0; // 实际存在多少天 DateTime current = start; for (; ; ) { if (nStop != 0) { strError = "用户中断"; return -1; } string strDate = DateTimeUtil.DateTimeToString8(current); string strFilename = this.StatisDir + "\\" + strDate + ".xml"; info.Days++; if (File.Exists(strFilename) == true) { XmlDocument dom = new XmlDocument(); try { dom.Load(strFilename); } catch (Exception ex) { strError = "装载首个文件 '" + strFilename + "' 到XMLDOM时出错: " + ex.Message; return -1; } nRet = MergeValues( strLibraryCodeList, valuetable, dom, info.Days - 1, valuestyle, out strError); if (nRet == -1) return -1; // 首个文件 if (nCount == 0) { info.RealStartDate = DateTimeUtil.DateTimeToString8(current); info.RealEndDate = DateTimeUtil.DateTimeToString8(current); } else { info.RealEndDate = DateTimeUtil.DateTimeToString8(current); } nCount++; info.RealDays++; } else { // 当天文件不存在的情况 if ((valuestyle & ValueStyle.List) != 0) { nRet = MergeValues( strLibraryCodeList, valuetable, null, info.Days - 1, valuestyle, out strError); if (nRet == -1) return -1; } } if (current >= end) break; current = current.AddDays(1); } // 把Hashtable中的值写入XML文件中 nRet = WriteToXmlFile( valuetable, strOutputFilename, valuestyle, out strError); if (nRet == -1) return -1; return 0; }
// 合并时间范围内的多个XML文件 // parameters: // strLibraryCodeList 馆代码列表。用来筛选 XML 文件中的分馆节点。如果想获得所有分馆的统计信息,那就需要用 "" 作为参数值 public int MergeXmlFiles( string strLibraryCodeList, ref int nStop, string strDateRangeString, string strStyle, string strOutputFilename, out RangeStatisInfo info, out string strError) { strError = ""; int nRet = 0; File.Delete(strOutputFilename); ValueStyle valuestyle = ValueStyle.None; if (StringUtil.IsInList("list", strStyle) == true) { valuestyle = ValueStyle.Total | ValueStyle.List; } else { valuestyle = ValueStyle.Total; } info = new RangeStatisInfo(); string strStartDate = ""; string strEndDate = ""; try { // 将日期字符串解析为起止范围日期 // throw: // Exception ParseDateRange(strDateRangeString, out strStartDate, out strEndDate); } catch (Exception ex) { strError = ExceptionUtil.GetAutoText(ex); return(-1); } info.StartDate = strStartDate; info.EndDate = strEndDate; DateTime start; DateTime end; try { start = DateTimeUtil.Long8ToDateTime(strStartDate); } catch (Exception ex) { strError = "日期字符串 '" + strDateRangeString + "' 格式错误: " + ex.Message; return(-1); } if (strEndDate == "") { end = start; info.EndDate = strStartDate; } else { try { end = DateTimeUtil.Long8ToDateTime(strEndDate); } catch (Exception ex) { strError = "日期字符串 '" + strDateRangeString + "' 格式错误: " + ex.Message; return(-1); } TimeSpan delta = end - start; if (delta.Days < 0) { // 交换两个时间 DateTime temp = end; end = start; start = temp; } } Hashtable valuetable = new Hashtable(); int nCount = 0; // 实际存在多少天 DateTime current = start; for (; ;) { if (nStop != 0) { strError = "用户中断"; return(-1); } string strDate = DateTimeUtil.DateTimeToString8(current); string strFilename = this.StatisDir + "\\" + strDate + ".xml"; info.Days++; if (File.Exists(strFilename) == true) { XmlDocument dom = new XmlDocument(); try { dom.Load(strFilename); } catch (Exception ex) { strError = "装载首个文件 '" + strFilename + "' 到XMLDOM时出错: " + ex.Message; return(-1); } nRet = MergeValues( strLibraryCodeList, valuetable, dom, info.Days - 1, valuestyle, out strError); if (nRet == -1) { return(-1); } // 首个文件 if (nCount == 0) { info.RealStartDate = DateTimeUtil.DateTimeToString8(current); info.RealEndDate = DateTimeUtil.DateTimeToString8(current); } else { info.RealEndDate = DateTimeUtil.DateTimeToString8(current); } nCount++; info.RealDays++; } else { // 当天文件不存在的情况 if ((valuestyle & ValueStyle.List) != 0) { nRet = MergeValues( strLibraryCodeList, valuetable, null, info.Days - 1, valuestyle, out strError); if (nRet == -1) { return(-1); } } } if (current >= end) { break; } current = current.AddDays(1); } // 把Hashtable中的值写入XML文件中 nRet = WriteToXmlFile( valuetable, strOutputFilename, valuestyle, out strError); if (nRet == -1) { return(-1); } return(0); }