1、 认识xml
可扩展标记语言,一种用于标记电子文档使其具有结果性的标记语言,它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。
2、 和超文本标记语言区别
2.1 html不一定需要成对出现,xml则一定需要成对出现。
2.2 html 不区分大小写,但是xml区分。
3、对xml文档增删改查
1 //声明一个XmlDocument空对象 2 protected XmlDocument XmlDoc = new XmlDocument(); 3 /// <summary> 4 /// 构造函数,导入xml文件 5 /// </summary> 6 /// <param name="path"></param> 7 public XmlHelper(string path) 8 { 9 try 10 { 11 XmlDoc.Load(path); 12 } 13 catch (Exception ex) 14 { 15 throw ex; 16 } 17 } 18 /// <summary> 19 /// 保存文件 20 /// </summary> 21 /// <param name="path"></param> 22 public void SaveXml(string path) 23 { 24 try 25 { 26 XmlDoc.Save(path); 27 } 28 catch (System.Exception ex) 29 { 30 throw ex; 31 } 32 }
1 /// <summary> 2 /// 获取节点的子节点的内容 3 /// </summary> 4 /// <param name="path"></param> 5 /// <param name="rootNode"></param> 6 /// <param name="attributeName"></param> 7 /// <returns></returns> 8 public string GetNodeChildAttribute(string path, string rootNode, string attributeName) 9 { 10 XmlNode xn = XmlDoc.SelectSingleNode(rootNode); 11 StringBuilder sb = new StringBuilder(); 12 XmlNodeList xnl = xn.ChildNodes; 13 14 foreach (XmlNode xnf in xnl) 15 { 16 XmlElement xe = (XmlElement)xnf; 17 XmlNodeList xnf1 = xe.ChildNodes; 18 foreach (XmlNode xn2 in xnf1) 19 { 20 if (xn2.Name == attributeName) 21 { 22 sb.Append(xn2.InnerText);//显示子节点点文本 23 } 24 } 25 } 26 return sb.ToString(); 27 }
1 /// <summary> 2 /// 获取节点的属性值 3 /// </summary> 4 /// <param name="path">xml路径</param> 5 /// <param name="rootNode">根节点名称</param> 6 /// <param name="attributeName">属性名称</param> 7 /// <returns></returns> 8 public string GetNodeAttribute(string path, string rootNode, string attributeName) 9 { 10 try 11 { 12 XmlNode xn = XmlDoc.SelectSingleNode(rootNode); 13 XmlNodeList xnl = xn.ChildNodes; 14 StringBuilder sb = new StringBuilder(); 15 foreach (XmlNode xnf in xnl) 16 { 17 XmlElement xe = (XmlElement)xnf; 18 sb.Append(xe.GetAttribute(attributeName)); 19 } 20 return sb.ToString(); 21 } 22 catch (Exception) 23 { 24 25 throw; 26 } 27 }
1 /// <summary> 2 /// 删除节点/节点属性 3 /// </summary> 4 /// <param name="path">xml文件地址</param> 5 /// <param name="rootNode">根节点名称</param> 6 /// <param name="delNode">要删除的节点</param> 7 /// <param name="attributeName">节点属性</param> 8 /// <param name="attributeValue">属性值</param> 9 public void DeleteNode(string path, string rootNode, string attributeName, string attributeValue) 10 { 11 try 12 { 13 XmlNodeList xnl = XmlDoc.SelectSingleNode(rootNode).ChildNodes; 14 foreach (XmlNode xn in xnl) 15 { 16 XmlElement xe = (XmlElement)xn; 17 if (xe.GetAttribute(attributeName) == attributeValue) 18 { 19 //xe.RemoveAttribute(attributeName);//删除属性 20 xe.RemoveAll();//删除该节点的全部内容 21 } 22 } 23 SaveXml(path); 24 } 25 catch (Exception) 26 { 27 28 throw; 29 } 30 }
1 /// <summary> 2 /// 修改节点的子节点内容 3 /// </summary> 4 /// <param name="path">xml文件路径</param> 5 /// <param name="rootNode">根节点名称</param> 6 /// <param name="attributeName">节点的子节点名称</param> 7 /// <param name="attributeOldValue">节点的子节点原始内容</param> 8 /// <param name="attributeNewValue">节点的子节点新内容</param> 9 public void UpdateChildNodeAttribute(string path, string rootNode, string attributeName, string attributeOldValue, string attributeNewValue) 10 { 11 try 12 { 13 XmlNodeList nodeList = XmlDoc.SelectSingleNode(rootNode).ChildNodes;//获取根节点的所有子节点 14 foreach (XmlNode xn in nodeList)//遍历所有子节点 15 { 16 XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型 17 if (string.IsNullOrEmpty(attributeName) || string.IsNullOrEmpty(attributeOldValue)) 18 { 19 return; 20 } 21 else 22 { 23 XmlNodeList nls = xe.ChildNodes; 24 if (nls != null && nls.Count > 0) 25 { 26 foreach (XmlNode xn1 in nls)//遍历 27 { 28 XmlElement xe2 = (XmlElement)xn1;//转换类型 29 if (xe2.InnerText == attributeOldValue)//如果找到 30 { 31 xe2.InnerText = attributeNewValue;//则修改 32 break;//找到退出来就可以了 33 } 34 } 35 } 36 } 37 } 38 SaveXml(path); 39 } 40 catch (Exception) 41 { 42 43 throw; 44 } 45 }
1 /// <summary> 2 /// 修改节点属性值操作 3 /// </summary> 4 /// <param name="path">xml文件路径</param> 5 /// <param name="rootNode">根节点名称,如:bookstore</param> 6 /// <param name="attributeName">节点属性名</param> 7 /// <param name="attributeOldValue">节点属性原来值</param> 8 /// <param name="attributeNewValue">节点属性修改后的值</param> 9 public void UpdateNodeAttribute(string path, string rootNode, string attributeName, string attributeOldValue, string attributeNewValue) 10 { 11 try 12 { 13 XmlNodeList nodeList = XmlDoc.SelectSingleNode(rootNode).ChildNodes;//获取根节点的所有子节点 14 foreach (XmlNode xn in nodeList)//遍历所有子节点 15 { 16 XmlElement xe = (XmlElement)xn;//将子节点类型专程xmlelement类型 17 if (string.IsNullOrEmpty(attributeName) || string.IsNullOrEmpty(attributeOldValue)) 18 { 19 return; 20 } 21 else 22 { 23 if (xe.GetAttribute(attributeName) == attributeOldValue) 24 { 25 xe.SetAttribute(attributeName, attributeNewValue); 26 } 27 } 28 } 29 SaveXml(path); 30 } 31 catch (Exception) 32 { 33 34 throw; 35 } 36 }
1 /// <summary> 2 /// 插入节点操作 3 /// </summary> 4 /// <param name="path">xml文件路径</param> 5 /// <param name="rootNode">根节点名称,如:bookstore</param> 6 /// <param name="node">节点名称,如:book</param> 7 /// <param name="nodeAttributes">节点的属性-属性值集合</param> 8 /// <param name="childAttributes">节点子节点名称-内容</param> 9 public void InsertNode(string path, string rootNode, string node, Dictionary<string, string> nodeAttributes, Dictionary<string, string> childAttributes) 10 { 11 try 12 { 13 XmlNode root = XmlDoc.SelectSingleNode(rootNode);//找到根节点bookstore 14 XmlElement xe1 = XmlDoc.CreateElement(node);//创建子节点book 15 if (nodeAttributes != null && nodeAttributes.Count > 0) 16 { 17 foreach (var n in nodeAttributes) 18 { 19 xe1.SetAttribute(n.Key, n.Value); 20 } 21 } 22 if (childAttributes != null && childAttributes.Count > 0) 23 { 24 XmlElement xesub1; 25 foreach (var n in childAttributes) 26 { 27 xesub1 = XmlDoc.CreateElement(n.Key); 28 xesub1.InnerText = n.Value; 29 xe1.AppendChild(xesub1);//添加到<book>节点中 30 } 31 } 32 root.AppendChild(xe1); 33 SaveXml(path); 34 } 35 catch (Exception) 36 { 37 38 throw; 39 } 40 }
调用:
1 string path = Server.MapPath("Books.xml"); 2 XmlHelper xHelper = new XmlHelper(path); 3 /*插入*/ 4 //Dictionary<string, string> dc1 = new Dictionary<string, string>(); 5 //dc1.Add("genre", "李赞红"); 6 //dc1.Add("ISBN", "2-3631-4"); 7 //Dictionary<strin插入g, string> dc2 = new Dictionary<string, string>(); 8 //dc2.Add("title", "CS从入门到精通"); 9 //dc2.Add("author", "候捷"); 10 //dc2.Add("price", "58.3"); 11 //xHelper.InsertNode(path, "bookstore", "book", dc1, dc2); 12 13 /*修改*/ 14 //xHelper.UpdateNodeAttribute(path, "bookstore", "genre", "李赞红", "李"); 15 //xHelper.UpdateChildNodeAttribute(path, "bookstore", "title", "CS从入门到精通", "cs"); 16 17 /*删除节点*/ 18 //xHelper.DeleteNode(path, "bookstore", "genre", "李"); 19 20 //Response.Write(xHelper.GetNodeAttribute(path, "bookstore", "genre")); 21 //Response.Write(xHelper.GetNodeChildAttribute(path, "bookstore", "price"));
4、通过xml数据绑定
xml转DataTable
1 public DataTable XmlToData(string path, string rootNode, params string[] columns) 2 { 3 DataTable dt = new DataTable(); 4 XmlNodeList xn = XmlDoc.SelectSingleNode(rootNode).ChildNodes; 5 try 6 { 7 if (columns.Length > 0) 8 { 9 DataColumn dc; 10 for (int i = 0; i < columns.Length; i++) 11 { 12 dc = new DataColumn(columns[i]); 13 dt.Columns.Add(dc); 14 } 15 foreach (XmlNode xnf in xn) 16 { 17 XmlElement xe = (XmlElement)xnf; 18 XmlNodeList xnf1 = xe.ChildNodes; 19 int i = 0; 20 DataRow dr = dt.NewRow(); 21 foreach (XmlNode xn2 in xnf1) 22 { 23 dr[i] = xn2.InnerText; 24 i++; 25 } 26 dt.Rows.Add(dr); 27 } 28 } 29 } 30 catch (Exception) 31 { 32 33 throw; 34 } 35 return dt; 36 37 }
调用:
1 //string[] arr = { "title", "author", "price" }; 2 //GridView1.DataSource = xHelper.XmlToData(path, "bookstore", arr); 3 //GridView1.DataBind();
DataTable转xml
1 /*datatable转xml*/ 2 public string DataTableToXml(DataTable dt) 3 { 4 if (dt != null) 5 { 6 MemoryStream ms = null; 7 XmlTextWriter XmlWt = null; 8 try 9 { 10 ms = new MemoryStream(); 11 //根据ms实例化XmlWt 12 XmlWt = new XmlTextWriter(ms, Encoding.Unicode); 13 //获取ds中的数据 14 dt.WriteXml(XmlWt); 15 int count = (int)ms.Length; 16 byte[] temp = new byte[count]; 17 ms.Seek(0, SeekOrigin.Begin); 18 ms.Read(temp, 0, count); 19 //返回Unicode编码的文本 20 UnicodeEncoding ucode = new UnicodeEncoding(); 21 string returnValue = ucode.GetString(temp).Trim(); 22 return returnValue; 23 } 24 catch (System.Exception ex) 25 { 26 throw ex; 27 } 28 finally 29 { 30 //释放资源 31 if (XmlWt != null) 32 { 33 XmlWt.Close(); 34 ms.Close(); 35 ms.Dispose(); 36 } 37 } 38 } 39 else 40 { 41 return ""; 42 } 43 }
调用:
1 //bool s = xHelper.CDataToXmlFile(xHelper.XmlToData(path, "bookstore", arr), "Bookss.xml","book");
5、xml序列化反序列化
1 [Serializable] 2 public class Person 3 { 4 public string Name { get; set; } 5 public int Age { get; set; } 6 }
1 public class CXmlSerializer<T> where T : new() 2 { 3 private static XmlSerializer _Serializer = new XmlSerializer(typeof(T)); 4 5 public static string Serialize(T t) 6 { 7 string s = ""; 8 using (MemoryStream ms = new MemoryStream()) 9 { 10 _Serializer.Serialize(ms, t); 11 s = System.Text.UTF8Encoding.UTF8.GetString(ms.ToArray()); 12 } 13 return s; 14 } 15 16 public static T Deserialize(string s) 17 { 18 T t; 19 using (MemoryStream ms = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(s))) 20 { 21 t = (T)_Serializer.Deserialize(ms); 22 } 23 return t; 24 } 25 }
调用:
1 List<Person> list = new List<Person> { new Person { Name = "Xuj", Age = 20 }, new Person { Name = "duj", Age = 20 }, new Person { Name = "fuj", Age = 20 } }; 2 string s = CXmlSerializer<List<Person>>.Serialize(list);