xml文件 实现“一次性”导入功能



1.Import.ashx.cs文件代码内容:

  1. public void ProcessRequest(HttpContext context)  
  2.        {  
  3.         context.Response.Clear();  
  4.         string username = context.Request.QueryString["username"];//操作人  
  5.            HttpFileCollection postedFile = context.Request.Files;  
  6.            //判断是否有数据  
  7.            if (postedFile != null && postedFile.Count > 0)  
  8.            {  
  9.                int length = postedFile[0].ContentLength;//文件大小  
  10.                string filename = System.IO.Path.GetFileNameWithoutExtension(postedFile[0].FileName);//文件名,不包括扩展名  
  11.             string path = HttpContext.Current.Server.MapPath("/XmlFiles/");//文件存放路径  
  12.             if (!System.IO.Directory.Exists(path))  
  13.                 System.IO.Directory.CreateDirectory(path);//创建文件夹  
  14.             string allfile = path + filename + DateTime.Now.ToString("yyyy-MM-dd") + ".xml";//文件路径+文件名   
  15.             postedFile[0].SaveAs(allfile);//保存文件内容   
  16.   
  17.             if (length > 0 && length < 512000)//文件最大允许500k  
  18.                {  
  19.                    string type = System.IO.Path.GetExtension(postedFile[0].FileName);//文件类型  
  20.                   
  21.                 if (type == ".xml")  
  22.                 {  
  23.                     //读取文件  
  24.                     QzSpecialisticDAL dal = new QzSpecialisticDAL();  
  25.                     QZ_IMPORT_LOG log = new QZ_IMPORT_LOG();  
  26.                     try  
  27.                     {  
  28.                         XmlDocument xmlDoc = new XmlDocument();  
  29.                         //加载xml   
  30.                         xmlDoc.Load(allfile); //path+filename为文件路径  
  31.   
  32.                         //读取指定的节点  
  33.                         #region 1.配送台账:读取QZ_DISPATCH_DETAILS节点  
  34.   
  35.                         QZ_DISPATCH_DETAILS details = dal.GetModels<QZ_DISPATCH_DETAILS>(xmlDoc, "/QZ_SPECIALISTIC/QZ_DISPATCH_DETAILS");  
  36.                         dal.InsertXmlData(details.DetailList, username, out log);  
  37.   
  38.                         log.IMPORT_NAME = "配送台账";//导入界面  
  39.                         if (!dal.AddImportLog(log))  
  40.                         {  
  41.                             string res1 = "{\"status\" : \"success\",\"msg\": \"配送台账日志插入错误上传失败!\"}";  
  42.                             context.Response.Write(res1);  
  43.                             return;  
  44.                         }  
  45.                         #endregion  
  46.  
  47.                         #region 2.零售台账:读取QZ_SPECIALISTIC_SALEDETAILS节点  
  48.   
  49.                         QZ_SPECIALISTIC_SALEDETAILS sales = dal.GetModels<QZ_SPECIALISTIC_SALEDETAILS>(xmlDoc, "/QZ_SPECIALISTIC/QZ_SPECIALISTIC_SALEDETAILS");  
  50.                         dal.InsertXmlData(sales.DetailList, username, out log);  
  51.   
  52.                         log.IMPORT_NAME = "零售台账";//导入界面   
  53.                         if (!dal.AddImportLog(log))  
  54.                         {  
  55.                             string res1 = "{\"status\" : \"success\",\"msg\": \"零售台账日志插入错误上传失败!\"}";  
  56.                             context.Response.Write(res1);  
  57.                             return;  
  58.                         }  
  59.                         #endregion  
  60.   
  61.                         string res = "{\"status\" : \"success\",\"msg\": \"上传成功!\"}";  
  62.                         context.Response.Write(res);  
  63.                     }  
  64.                     catch (Exception e)  
  65.                     {  
  66.                         string res = "{\"status\" : \"error\",\"msg\": \"文件格式错误上传失败!\"}";  
  67.                         context.Response.Write(res);  
  68.                         return;  
  69.                     }   
  70.                 }  
  71.                 else  
  72.                 {  
  73.                     string res = "{\"status\" : \"error\",\"msg\": \"只允许上传.xml类型的文件!\"}";  
  74.                     context.Response.Write(res);  
  75.                     return;  
  76.                 }  
  77.                }  
  78.                else  
  79.                {  
  80.                    string res = "{\"status\" : \"error\",\"msg\": \"文件过大!\"}";  
  81.                    context.Response.Write(res);  
  82.                    return;  
  83.                }  
  84.            }  
  85.        }  
 public void ProcessRequest(HttpContext context)
        {
			context.Response.Clear();
			string username = context.Request.QueryString["username"];//操作人
            HttpFileCollection postedFile = context.Request.Files;
            //判断是否有数据
            if (postedFile != null && postedFile.Count > 0)
            {
                int length = postedFile[0].ContentLength;//文件大小
                string filename = System.IO.Path.GetFileNameWithoutExtension(postedFile[0].FileName);//文件名,不包括扩展名
				string path = HttpContext.Current.Server.MapPath("/XmlFiles/");//文件存放路径
				if (!System.IO.Directory.Exists(path))
					System.IO.Directory.CreateDirectory(path);//创建文件夹
				string allfile = path + filename + DateTime.Now.ToString("yyyy-MM-dd") + ".xml";//文件路径+文件名 
				postedFile[0].SaveAs(allfile);//保存文件内容 

				if (length > 0 && length < 512000)//文件最大允许500k
                {
                    string type = System.IO.Path.GetExtension(postedFile[0].FileName);//文件类型
					
					if (type == ".xml")
					{
						//读取文件
						QzSpecialisticDAL dal = new QzSpecialisticDAL();
						QZ_IMPORT_LOG log = new QZ_IMPORT_LOG();
						try
						{
							XmlDocument xmlDoc = new XmlDocument();
							//加载xml 
							xmlDoc.Load(allfile); //path+filename为文件路径

							//读取指定的节点
							#region 1.配送台账:读取QZ_DISPATCH_DETAILS节点

							QZ_DISPATCH_DETAILS details = dal.GetModels<QZ_DISPATCH_DETAILS>(xmlDoc, "/QZ_SPECIALISTIC/QZ_DISPATCH_DETAILS");
							dal.InsertXmlData(details.DetailList, username, out log);

							log.IMPORT_NAME = "配送台账";//导入界面
							if (!dal.AddImportLog(log))
							{
								string res1 = "{\"status\" : \"success\",\"msg\": \"配送台账日志插入错误上传失败!\"}";
								context.Response.Write(res1);
								return;
							}
							#endregion

							#region 2.零售台账:读取QZ_SPECIALISTIC_SALEDETAILS节点

							QZ_SPECIALISTIC_SALEDETAILS sales = dal.GetModels<QZ_SPECIALISTIC_SALEDETAILS>(xmlDoc, "/QZ_SPECIALISTIC/QZ_SPECIALISTIC_SALEDETAILS");
							dal.InsertXmlData(sales.DetailList, username, out log);

							log.IMPORT_NAME = "零售台账";//导入界面 
							if (!dal.AddImportLog(log))
							{
								string res1 = "{\"status\" : \"success\",\"msg\": \"零售台账日志插入错误上传失败!\"}";
								context.Response.Write(res1);
								return;
							}
							#endregion

							string res = "{\"status\" : \"success\",\"msg\": \"上传成功!\"}";
							context.Response.Write(res);
						}
						catch (Exception e)
						{
							string res = "{\"status\" : \"error\",\"msg\": \"文件格式错误上传失败!\"}";
							context.Response.Write(res);
							return;
						} 
					}
					else
					{
						string res = "{\"status\" : \"error\",\"msg\": \"只允许上传.xml类型的文件!\"}";
						context.Response.Write(res);
						return;
					}
                }
                else
                {
                    string res = "{\"status\" : \"error\",\"msg\": \"文件过大!\"}";
                    context.Response.Write(res);
                    return;
                }
            }
        }

2.所调用方法:

InsertXmlData方法,实现入库校验操作:

  1. public void InsertXmlData<T>(List<T> models,string username,out QZ_IMPORT_LOG logmodel) where T : new()  
  2.         {  
  3.             QZ_IMPORT_LOG log =new QZ_IMPORT_LOG();  
  4.             int sum = models.Count;  
  5.             int j = 0;  
  6.             string mismessage = "";  
  7.             string[] s = models.ToString().Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);  
  8.             string model = s[s.Length - 1].Replace("]""").Trim();  
  9.   
  10.             if (models != null)//判断节点下是否有子节点   
  11.             {  
  12.                 //循环遍历detail结点下的子结点      
  13.                 foreach (T submodel in models)  
  14.                 {  
  15.                     //校验Id是否重复    
  16.                     string id = submodel.GetType().GetProperty("ID").GetValue(submodel,null).ToString();  
  17.                     if (ExixtsID(model, id))  
  18.                     {  
  19.                         if (OracleHelper.Insert<T>(submodel))//插入数据库  
  20.                         {  
  21.                             j++;//成功上传条数   
  22.                         }  
  23.                         else  
  24.                         {  
  25.                             //上传失败  
  26.                             mismessage += "id=" + id + "数据插入错误,上传失败;";  
  27.                         }  
  28.                     }  
  29.                     else  
  30.                     {  
  31.                         //上传失败  
  32.                         mismessage += "id=" + id + "已导入;";  
  33.                     }  
  34.                 }   
  35.                 //录入上传日志数据  
  36.                 log.IMPORT_DATE = DateTime.Now;//导入时间   
  37.                 log.IMPORT_TABLENAME = model;//导入表名  
  38.                 log.IMPORT_NUM = sum;//导入总条数  
  39.                 log.IMPORT_NUM_OK = j;//导入成功条数  
  40.                 log.REMARK = mismessage;//未成功错误信息    
  41.                 log.OPERATOR = username;//操作人  
  42.             }  
  43.             logmodel = log;  
  44.         }  
public void InsertXmlData<T>(List<T> models,string username,out QZ_IMPORT_LOG logmodel) where T : new()
		{
			QZ_IMPORT_LOG log =new QZ_IMPORT_LOG();
			int sum = models.Count;
			int j = 0;
			string mismessage = "";
			string[] s = models.ToString().Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
			string model = s[s.Length - 1].Replace("]", "").Trim();

			if (models != null)//判断节点下是否有子节点 
			{
				//循环遍历detail结点下的子结点    
				foreach (T submodel in models)
				{
					//校验Id是否重复  
					string id = submodel.GetType().GetProperty("ID").GetValue(submodel,null).ToString();
					if (ExixtsID(model, id))
					{
						if (OracleHelper.Insert<T>(submodel))//插入数据库
						{
							j++;//成功上传条数 
						}
						else
						{
							//上传失败
							mismessage += "id=" + id + "数据插入错误,上传失败;";
						}
					}
					else
					{
						//上传失败
						mismessage += "id=" + id + "已导入;";
					}
				} 
				//录入上传日志数据
				log.IMPORT_DATE = DateTime.Now;//导入时间 
				log.IMPORT_TABLENAME = model;//导入表名
				log.IMPORT_NUM = sum;//导入总条数
				log.IMPORT_NUM_OK = j;//导入成功条数
				log.REMARK = mismessage;//未成功错误信息  
				log.OPERATOR = username;//操作人
			}
			logmodel = log;
		}

 GetModels方法获取反序列化数据:

  1. public T GetModels<T>(XmlDocument xmlDoc, string singleNode) where T : new()  
  2.         {  
  3.             XmlNode xmlNode = xmlDoc.SelectSingleNode(singleNode);  
  4.             StringReader stream = new StringReader(xmlNode.OuterXml);  
  5.             string xml = stream.ReadToEnd();  
  6.             return XmlDeserialize<T>(xml, Encoding.UTF8);   
  7.         }  
public T GetModels<T>(XmlDocument xmlDoc, string singleNode) where T : new()
		{
			XmlNode xmlNode = xmlDoc.SelectSingleNode(singleNode);
			StringReader stream = new StringReader(xmlNode.OuterXml);
			string xml = stream.ReadToEnd();
			return XmlDeserialize<T>(xml, Encoding.UTF8); 
		}
XmlDeserialize实现反序列化:

  1. public T XmlDeserialize<T>(string s, Encoding encoding) where T : new()  
  2.         {  
  3.             if (string.IsNullOrEmpty(s))  
  4.                 throw new ArgumentNullException("s");  
  5.             if (encoding == null)  
  6.                 throw new ArgumentNullException("encoding");  
  7.   
  8.             XmlSerializer mySerializer = new XmlSerializer(typeof(T));  
  9.             using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))  
  10.             {  
  11.                 using (StreamReader sr = new StreamReader(ms, encoding))  
  12.                 {  
  13.                     return (T)mySerializer.Deserialize(sr);  
  14.                 }  
  15.             }  
  16.         }  
public T XmlDeserialize<T>(string s, Encoding encoding) where T : new()
		{
			if (string.IsNullOrEmpty(s))
				throw new ArgumentNullException("s");
			if (encoding == null)
				throw new ArgumentNullException("encoding");

			XmlSerializer mySerializer = new XmlSerializer(typeof(T));
			using (MemoryStream ms = new MemoryStream(encoding.GetBytes(s)))
			{
				using (StreamReader sr = new StreamReader(ms, encoding))
				{
					return (T)mySerializer.Deserialize(sr);
				}
			}
		}

xml文件格式:

  1. <QZ_SPECIALISTIC><QZ_SPECIALISTIC_DESTROYS>  
  2.   <QZ_SPECIALISTIC_DESTROY>  
  3.     <ID>4</ID>  
  4.     <DESTROY_DATE>2016-01-11</DESTROY_DATE>  
  5.     <SPECIALISTIC_ID>425002</SPECIALISTIC_ID>  
  6.     <SPECIALISTIC_NAME>珍新泉港店</SPECIALISTIC_NAME>  
  7.     <MEAT_CODE>101</MEAT_CODE>  
  8.     <MEAT_NAME>猪舌</MEAT_NAME>  
  9.     <WEIGHT>28</WEIGHT>  
  10.     <OPERATOR>阿玉姐姐</OPERATOR>  
  11.     <UPLOAD_TYPE>2</UPLOAD_TYPE>  
  12.   </QZ_SPECIALISTIC_DESTROY>  
  13.   <QZ_SPECIALISTIC_DESTROY>  
  14.     <ID>5</ID>  
  15.     <DESTROY_DATE>2016-01-11</DESTROY_DATE>  
  16.     <SPECIALISTIC_ID>425002</SPECIALISTIC_ID>  
  17.     <SPECIALISTIC_NAME>珍新泉港店</SPECIALISTIC_NAME>  
  18.     <MEAT_CODE>102</MEAT_CODE>  
  19.     <MEAT_NAME>猪条</MEAT_NAME>  
  20.     <WEIGHT>t</WEIGHT>  
  21.     <OPERATOR>阿玉姐姐</OPERATOR>  
  22.     <UPLOAD_TYPE>2</UPLOAD_TYPE>  
  23.   </QZ_SPECIALISTIC_DESTROY>  
  24. </QZ_SPECIALISTIC_DESTROYS>  
  25. <QZ_SPECIALISTIC_SURPLUSS>  
  26.   <QZ_SPECIALISTIC_SURPLUS>  
  27.     <ID>1</ID>  
  28.     <REGISTER_DATE>2016-01-11</REGISTER_DATE>  
  29.     <SPECIALISTIC_ID>425002</SPECIALISTIC_ID>  
  30.     <SPECIALISTIC_NAME>珍新泉港店</SPECIALISTIC_NAME>  
  31. <span style="white-space:pre">    </span><MEAT_CODE>102</MEAT_CODE>  
  32.     <MEAT_NAME>猪条</MEAT_NAME>  
  33.     <WEIGHT>150</WEIGHT>  
  34.     <OPERATOR>吴老大</OPERATOR>  
  35. <span style="white-space:pre">    </span><UPLOAD_TYPE>2</UPLOAD_TYPE>  
  36.   </QZ_SPECIALISTIC_SURPLUS>  
  37.   <QZ_SPECIALISTIC_SURPLUS>  
  38.     <ID>2</ID>  
  39.     <REGISTER_DATE>2016-01-11</REGISTER_DATE>  
  40.     <SPECIALISTIC_ID>425002</SPECIALISTIC_ID>  
  41.     <SPECIALISTIC_NAME>珍新泉港店</SPECIALISTIC_NAME>  
  42. <span style="white-space:pre">    </span><MEAT_CODE>102</MEAT_CODE>  
  43.     <MEAT_NAME>猪条</MEAT_NAME>  
  44.     <WEIGHT>150</WEIGHT>  
  45.     <OPERATOR>吴老大</OPERATOR>  
  46. <span style="white-space:pre">    </span><UPLOAD_TYPE>2</UPLOAD_TYPE>  
  47.   </QZ_SPECIALISTIC_SURPLUS>  
  48. </QZ_SPECIALISTIC_SURPLUSS></QZ_SPECIALISTIC> 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值