1.简单读写:
引入using System.Xml;命名空间
写操作
//创建XmlDocument对象 XmlDocument doc = new XmlDocument(); //载入(.load方法载入具体文件) doc.LoadXml("<Student type=‘regular‘ Section=‘B‘><Name>xlh</Name></Student>");
//常用属性方法有SelectSingleNode,ChildNodes,GetAttribute,AppendChild等,处理逻辑为遍历查找,例如: XmlNodeList nodeList = xmlDoc.SelectSingleNode("bookstore").ChildNodes;//获取bookstore节点的所有子节点,对于指定名称节点可以通过 XmlNodeList lis = doc.GetElementsByTagName("Name") ,然后取值 String str = lis[0].InnerText 获得。
foreach (XmlNode xn in nodeList)//遍历所有子节点 { XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型 if (xe.GetAttribute("genre") == "李赞红")//如果genre属性值为“李赞红” { xe.SetAttribute("genre", "update李赞红");//则修改该属性为“update李赞红” XmlNodeList nls = xe.ChildNodes;//继续获取xe子节点的所有子节点 foreach (XmlNode xn1 in nls)//遍历 { XmlElement xe2 = (XmlElement)xn1;//转换类型 if (xe2.Name == "author")//如果找到 { xe2.InnerText = "亚胜";//则修改 break;//找到退出来就可以了 } } break; } }
也可以通过XmlWriter来进行写入
读操作
通过XmlReader读取器例如
using (XmlReader read = XmlReader.Create(xmUrl)) { while (read.Read()) { switch (read.NodeType) { case XmlNodeType.Element: break; case XmlNodeType.Text: xs += read.Value + "|"; break; } } }
将文本内容取出,或者 XmlNodeList lis = doc.GetElementsByTagName("Name") 遍历指定属性来获取。以上方法只适合简单少量的读取,对于规则性数据还要采用序列化的方式。
创建操作参见http://www.cnblogs.com/yukaizhao/archive/2011/07/19/csharp_xmldocument_access_xml.html
2.序列化使用:
系列化将数据封装在数据实体中,所以使用时先定义实体类
[XmlRoot("Root")] public class People { [XmlAttribute("NAME")] public string Name { set; get; } [XmlAttribute("AGE")] public int Age { set; get; } } [XmlRoot("Root")] public class Student : People { [XmlElement("CLASS")] public string Class { set; get; } [XmlElement("NUMBER")] public int Number { set; get; } }
定义特性直接表示了xml文档结构关系。处理单元中要处理的数据
Student stu = new Student() { Age = 10, Class = "Class One", Name = "Tom", Number = 1 };
序列化
XmlSerializer ser = new XmlSerializer(typeof(Student)); ser.Serialize(File.Create("C:\\x.xml"), stu);
反序列化
XmlSerializer ser = new XmlSerializer(typeof(Student)); Student stu = ser.Deserialize(File.OpenRead("C:\\x.xml")) as Stud
关于序列化操作找到一个封装好的操作类
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml.Serialization; using System.IO; using System.Xml; // 此处代码来源于博客【在.net中读写config文件的各种方法】的示例代码 // http://www.cnblogs.com/fish-li/archive/2011/12/18/2292037.html namespace MyMVC { public static class XmlHelper { /// <summary> /// 序列化操作以及流中换行处理 /// </summary> /// <param name="stream"></param> /// <param name="o"></param> /// <param name="encoding"></param> private static void XmlSerializeInternal(Stream stream, object o, Encoding encoding) { if (o == null) throw new ArgumentNullException("o"); if (encoding == null) throw new ArgumentNullException("encoding"); XmlSerializer serializer = new XmlSerializer(o.GetType()); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.NewLineChars = "\r\n"; settings.Encoding = encoding; settings.IndentChars = " "; //按照相关设置快速序列化对象 using (XmlWriter writer = XmlWriter.Create(stream, settings)) { serializer.Serialize(writer, o); writer.Close(); } } /// <summary> /// 将一个对象序列化为XML字符串 /// </summary> /// <param name="o">要序列化的对象</param> /// <param name="encoding">编码方式</param> /// <returns>序列化产生的XML字符串</returns> public static string XmlSerialize(object o, Encoding encoding) { using (MemoryStream stream = new MemoryStream()) { XmlSerializeInternal(stream, o, encoding); stream.Position = 0; using (StreamReader reader = new StreamReader(stream, encoding)) { return reader.ReadToEnd(); } } } /// <summary> /// 将一个对象按XML序列化的方式写入到一个文件 /// </summary> /// <param name="o">要序列化的对象</param> /// <param name="path">保存文件路径</param> /// <param name="encoding">编码方式</param> public static void XmlSerializeToFile(object o, string path, Encoding encoding) { if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path"); using (FileStream file = new FileStream(path, FileMode.Create, FileAccess.Write)) { XmlSerializeInternal(file, o, encoding); } } /// <summary> /// 从XML字符串中反序列化对象 /// </summary> /// <typeparam name="T">结果对象类型</typeparam> /// <param name="s">包含对象的XML字符串</param> /// <param name="encoding">编码方式</param> /// <returns>反序列化得到的对象</returns> public static T XmlDeserialize<T>(string s, Encoding encoding) { 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); } } } /// <summary> /// 读入一个文件,并按XML的方式反序列化对象。 /// </summary> /// <typeparam name="T">结果对象类型</typeparam> /// <param name="path">文件路径</param> /// <param name="encoding">编码方式</param> /// <returns>反序列化得到的对象</returns> public static T XmlDeserializeFromFile<T>(string path, Encoding encoding) { if (string.IsNullOrEmpty(path)) throw new ArgumentNullException("path"); if (encoding == null) throw new ArgumentNullException("encoding"); string xml = File.ReadAllText(path, encoding); return XmlDeserialize<T>(xml, encoding); } } }
补充:关于序列化不光xml序列化,json数据也需要序列化
.net3.5以上可以通过DataContractJsonSerializer类和JavaScriptSerializer类序列化操作 (DataContractJsonSerializer在.NET Framework 3.5包含在System.ServiceModel.Web.dll中,需要添加对其的引用;.NET Framework 4在System.Runtime.Serialization中)
例如
//序列化
string r1 = jsonSerializer.Serialize(personnel); //反序列化 Personnel _Personnel = jsonSerializer.Deserialize<Personnel>(r1);
.net2.0可以使用第三方的Newtonsoft.Json.dll进行序列化,例如:
JsonSerializer jsser = new JsonSerializer(); //wInfo为事先定义好的实体类 wInfo = JsonConvert.DeserializeObject<IpInfo>(jsonData);
原文:http://www.cnblogs.com/wanglao/p/3543193.html