【一周工作总结】循环调用接口,和一些Xml格式文件的解析。
来源:互联网 发布:开淘宝店铺照片要求 编辑:程序博客网 时间:2024/06/10 23:30
上周五,项目组老大,给我提了一下有个关于WebService的项目。由于当时时间仓促,对项目的需求理解出现偏差,导致我做到周二晚,才知道做的东西是方向反了。没办法,只好加加班,努力赶出来了。
1、既然是要写服务,还要周期性调用,那必然就离不开Timer类的调用了。注意:是System.Timer命名空间下的而不是System.Thread下的。
(PS:Timer类的具体方法以及属性的介绍我就不详细介绍了,这些东西在这里都有详细介绍https://msdn.microsoft.com/zh-cn/library/system.timers.timer(v=vs.110).aspx)
使用Timer写定时器那是相当的方便的。
//如果需要写日志的话,准备一个
ConcurrentQueue<string> logQueue = new ConcurrentQueue<string>();//日志容器。
ConcurrentQueue<string> exQueue = new ConcurrentQueue<string>();//异常容器。
把日志放在这2个里面然后需要调用的时候再释放出来比较好,这样不容易出现一些线程占用的异常。
#region 定时器的编写
System.Timers.Timer mTimer=new System.Timers.Timer() //声明Timer类。
mTimer.Interval=1000;//定时器间隔时间的编写。
mTimer.Elapsed+=new System.Timers.ElapsedEventHandler(mTimer_Elapsed);//每此到了时间间隔的时候便调用括号中的方法。
mTimer.AutoReset=true; //如果Timer应在每次间隔结束时引发 Elapsed 事件,则为 true;如果它仅在间隔第一次结束后引发一次 Elapsed 事件,则为 false。默认值为true。
#endregion
接下来便是要写具体方法
private void mTimer_Elapsed(object sender,System.Timers.ElapsedEventArgs e)
{
try
{
#region 写Log日志
writelog = new StringBuilder();
icnt = logQueue.Count;
haveEx = false;
for (int i = 0; i < icnt; i++)
{
string ex;
logQueue.TryDequeue(out ex);
writelog.Append(ex);
writelog.Append("\r\n");
haveEx = true;
}
if (haveEx)
{
LogWrite.Log(writelog.ToString());
}
writelog.Clear();
writelog = null;
#endregion
#region 写异常日志
writelog = new StringBuilder();
icnt = exQueue.Count;
haveEx = false;
for (int i = 0; i < icnt; i++)
{
string ex;
exQueue.TryDequeue(out ex);
writelog.Append(ex);
writelog.Append("\r\n");
haveEx = true;
}
if (haveEx)
{
LogWrite.Log(writelog.ToString(), "ExceptionCollection", "ErrorLog");
}
writelog.Clear();
writelog = null;
#endregion
//里面是具体想要定时实现的方法,如果有多个。可以使用线程池,
if (listRunTime.Contains(nowtime.ToString("HHmm")))
{
ThreadPool.QueueUserWorkItem(new WaitCallback(downloadAllDataFile), null);
ThreadPool.QueueUserWorkItem(new WaitCallback(SendBusStation), null);
}
}
}
线程里调用的方法写成
private void downloadAllDataFile(object obj)
{
//具体方法
}
2、循环调用会使用了,接下来,便是解析接口了常见的接口穿过来的数据一般分为Xml,String型的XML字符串,byte[]文件还有Json以上4种
2.1、如果得到的是XML格式文件则需要先转换为字符串格式,然后再进行解析,常见的解析是把XML格式的东西放在DataSet里。
XMLNode xmlnode=接口方法所返回的XML流。
string xmlString=xmlnode.InnerXml;
2.2、如果得到的是String型的字符串可以用XmlDocument类进行解析。
XmlDocument xmldoc=new XmlDocument()
xmldoc.LoadXml(xmlString);
string xml=xmldoc.InnerXml;
//存储XmlString
xmldoc.Save(filename+".xml");
2.3、如果得到的是byte[] bytes 可以通过Ecording类解析
string xml=Ecording.UTF8.GetString(bytes);
//转换后有可能会出 1行1列根目录下出现错误这样的BUG,其实这是因为有些隐藏的转换字符\n\r。
xml = " < "+xml.Substring(xml.IndexOf('<')+1);
PS:存储byte[] bytes文件
string xmlPath=AppDomain.CurrentDomain.BaseDirectory+"文件夹名字"+"\\"+DateTime.Now.ToString("yyyy-MM-dd")+"\\";
if (!Directory.Exists(xmlPath))
{
Directory.CreateDirectory(xmlPath);
}
//存储Xml文件
FileStream filestream = new FileStream(xmlPath + DateTime.Now.ToString("HHmmss") + ".xml", FileMode.Create);
filestream.Write(bytes, 0, bytes.Length);
filestream.Flush();
filestream.Close();
2.4、Json型。我的这个项目没有Json型的数据,所以这个可以用来先了解一下。
准备数据:
实体类:
[DataContract]
public class Person
{
[DataMember(Order = 0,IsRequired = true)]
public string Name { get; set; }
[DataMember(Order = 1)]
public int Age { get; set; }
[DataMember(Order = 2)]
public bool Alive { get; set; }
[DataMember(Order = 3)]
public string[] FavoriteFilms { get; set; }
[DataMember(Order = 4)]
public Person Child { get; set; }
}
定义:
Action<object> log = o => Console.WriteLine(o);
Func<int, int, int> add=(x, y) => x + y;
var p1 = new Person {
Age = 12,
Alive = true,
Name = "lj",
FavoriteFilms = new[] {"up", "Avatar"}
};
var p2 = new Person() { Age = 28, Name = "cy", Child = p1 };
使用DataContractJsonSerializer
帮助类:
// using System.Runtime.Serialization.Json;
/// <summary>
/// 解析JSON,仿Javascript风格
/// </summary>
public static class JSON
{
public static T parse<T>(string jsonString)
{
using (var ms = new MemoryStream(Encoding.UTF8.GetBytes(jsonString)))
{
return (T)new DataContractJsonSerializer(typeof(T)).ReadObject(ms);
}
}
public static string stringify(object jsonObject)
{
using (var ms = new MemoryStream())
{
new DataContractJsonSerializer(jsonObject.GetType()).WriteObject(ms, jsonObject);
return Encoding.UTF8.GetString(ms.ToArray());
}
}
}
用法:
// 序列化
var jsonString = JSON.stringify(new[] { p1, p2 });
log(jsonString == JSON.stringify(new List<Person>() { p1, p2 })); //true
log(jsonString);
// 反序列化,泛型集合
JSON.parse<List<Person>>(jsonString);
// 数组转换
JSON.parse<Person[]>(jsonString);
输出:
[{"Name":"lj","Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null
},{"Name":"cy","Age":28,"Alive":false,"FavoriteFilms":null,"Child":{"Name":"lj",
"Age":12,"Alive":true,"FavoriteFilms":["Up","Avatar"],"Child":null}}]
使用JavaScriptSerializer
// using System.Web.Script.Serialization;
var jser = new JavaScriptSerializer();
var json = jser.Serialize(new List<Person>() { p1, p2 });
var persons = jser.Deserialize<List<Person>>(json);
使用Silverlight
//using System.Json
var css = "{ \"#header\" : {background:\"red\"}, layout : [5,4,1],color:\"cyan\" }";
var style = JsonObject.Parse(css) as JsonObject;
(
from s in style
where s.Key == "color"
select (string)s.Value
).First().ToString();
// "cyan"
// 更多操作
style["layout"][0] = 22;
var hd = style["#header"];
style["body>div+p"] = hd;
style.Remove("#header");
var bd = new JsonObject();
bd["border"] = "1px solid cyan";
style["body>div+p"]["#meta"] = bd;
style.ToString();
// {"layout":[22,4,1],"color":"cyan","body>div+p":{"background":"red","#meta":{"border":"1px solid cyan"}}}
使用JSON.NET
// using Newtonsoft.Json;
var json = JsonConvert.SerializeObject(new[] { p1, p2 });
var persons = JsonConvert.DeserializeObject<List<Person>>(json);
var ja = JArray.Parse(jsonString);
log(ja); //注意,格式化过的输出
3、把Xml字符串放入DataSet中
StringReader stream=new StringReader(xmlString);
XmlTextReader reader=new XmlTextReader(stream);
ds.ReadXml(reader);
//把数据放到ds中之后,接下来就是要么把ds中的数据直接传给datagridview,一般情况下是要对数据进行分别解析的。
//这里有个简单的方法,可以一次性把每个ds所含有的表中的数据传给实体类。(PS:实体类的属性名要跟ds中每个表中的列名对应,推荐含有数据最多的表,采用这样的方法)
//假设ds中有一个station表,而我也对应着Station表,所建了一个station类,里面的属性和列名一致,里面每个属性也都是一样的类型。
Station station=new Station();
Type type=typeof(Station); //获取Station中所有的类型。
PropertyInfo[] propertys=type.GetProperties(BindingFlags.Public | BingdingFlags.Instance); //通过反射拿到station中所有的public的属性。
foreach(PropertyInfo property in propertys)
{
if (int i = 0; i < ds.Tables["Station"].Columns.Count; i++)
{
if (ds.Tables["Station"].Columns[i].ToString() == property.Name)
{if (!string.IsNullOrWhiteSpace(ds.Tables["Station"].Rows[0][property.Name].ToString()))
{
property.SetValue(station, ds.Tables["Station"].Rows[0][property.Name].ToString(), null);
}
else
{
property.SetValue(station, "空", null); //如果该数据不存在,就为空。(可以根据自己的需求进行修改)
}
}
}
}
4、将文件转换为btye[]型
(1)private byte[] GetBytesPath(string strPath)
{
FileStream filereader = new FileStream(strPath, FileMode.Open, FileAccess.Read);
BinaryReader xmlReader = new BinaryReader(filereader);
byte[] bytes = xmlReader.ReadBytes((int)filereader.Length);
filereader.Flush();
filereader.Close();
return bytes;
}
(2)private byte[] GetBytesPath(string strPath)
{
string filePath = Server.MapPath("File/") + filename;
if (File.Exists(filePath))
{
try
{
FileStream s = File.OpenRead(filePath);
return ConvertStreamToByteBuffer(s);
}
catch (Exception)
{
return new byte[0];
}
}
else
{
return new byte[0];
}
}
/// <summary>
/// 将Stream流转为byte数组
/// </summary>
/// <param name="s"></param>
/// <returns></returns>
private byte[] ConvertStreamToByteBuffer(Stream s)
{
MemoryStream ms = new MemoryStream();
int b;
while ((b=s.ReadByte())!=-1)
{
ms.WriteByte((byte)b);
}
return ms.ToArray();
}
- 【一周工作总结】循环调用接口,和一些Xml格式文件的解析。
- 生成和解析XML格式文件
- 接口的调用及xml的解析
- 解析调用接口内容和构建接口请求xml
- 对于EXCEL2003的XML格式文件的解析
- 一周工作总结--左连接造成的一些问题
- 一周以来的工作总结
- 实习一周的工作总结
- XML格式文件解析
- Java生成和解析XML格式文件和字符串的实例代码【dom4j中的SAXReader对象读取并解析xml文件】
- Java生成和解析XML格式文件和字符串的实例代码
- Java生成和解析XML格式文件和字符串的实例代码
- Java生成和解析XML格式文件和字符串的实例代码
- Java生成和解析XML格式文件和字符串
- 调用接口,解析返回的的string类型xml文档
- Java 语言对XMl 格式文件的 纯解析
- 解析XML的 循环节点
- 一周工作总结
- CSS选择器
- Java之网络编程
- Android异步消息处理机制完全解析,带你从源码的角度彻底理解
- Android 不得不说的VideoView的一些坑及其解决方案
- DRBD编译安装中出现的问题及解决小结
- 【一周工作总结】循环调用接口,和一些Xml格式文件的解析。
- 【GDB调试学习笔记】Makefile生成多个可执行文件
- java中的IO
- java代理模式代码
- Java容器集合类的区别用法
- 轻松把玩HttpClient之设置代理,可以访问FaceBook
- j2EE--基础2
- 常见排序算法及php实现代码
- 引用类型