xml文件
可扩展标记性语言,用来保存轻量级数据。
XML的标签是成对出现的、并且是区分大小写的。
XML文档必须包含根节点,且只有一个。
创建XML文件
1 //创建XML对象 2 XmlDocument doc = new XmlDocument(); 3 //创建文档描述信息 4 XmlDeclaration dec = doc.CreateXmlDeclaration("1.0", "utf-8", null); 5 doc.AppendChild(dec); 6 7 //创建根节点 8 XmlElement books = doc.CreateElement("Books"); 9 doc.AppendChild(books); 10 11 //创建子节点 12 XmlElement book1 = doc.CreateElement("Book"); 13 books.AppendChild(book1); //将子节点添加到books 14 15 //给book1子节点追加子节点 16 XmlElement name1 = doc.CreateElement("Name"); 17 name1.InnerText = "c#"; //赋值 文本值 18 book1.AppendChild(name1); 19 20 XmlElement price1 = doc.CreateElement("Price"); 21 price1.InnerXml = "<b>10.0</b>"; //赋值 html标签 22 book1.AppendChild(price1); 23 24 XmlElement items = doc.CreateElement("Items"); 25 //给节点增加属性 26 items.SetAttribute("Name", "c#"); 27 items.SetAttribute("Price", "10.0"); 28 book1.AppendChild(items); 29 30 doc.Save("Books.xml"); //保存 31 32 //创建后 33 <?xml version="1.0" encoding="utf-8"?> 34 <Books> 35 <Book> 36 <Name>c#</Name> 37 <Price> 38 <b>10.0</b> 39 </Price> 40 <Items Name="c#" Price="10.0" /> 41 </Book> 42 </Books>
向已有XML文件中追加
1 XmlDocument doc = new XmlDocument(); 2 if (File.Exists("Books.xml")) 3 { 4 doc.Load("Books.xml"); //加载 xml 5 XmlElement books = doc.DocumentElement; //得到根节点 6 //再建立元素进行追加 7 }
获取XML文件
1 XmlDocument doc = new XmlDocument(); 2 doc.Load("Books.xml"); 3 4 XmlElement books = doc.DocumentElement; 5 XmlNodeList xnl = books.ChildNodes; //得到所有节点 6 7 foreach (XmlNode v in xnl) //遍历得到所有节点值 8 { 9 Console.WriteLine(v.InnerText); 10 } 11 12 XmlNodeList xnl1 = doc.SelectNodes("Books/Book/Items"); //查找节点列表 13 foreach (XmlNode node in xnl1) 14 { 15 Console.WriteLine(node.Attributes["Name"].Value); //得到name属性的值 16 Console.WriteLine(node.Attributes["Price"].Value); //得到price属性的值 17 }
删除XML文件
1 XmlDocument doc = new XmlDocument(); 2 doc.Load("Books.xml"); 3 4 XmlNode xnl = doc.SelectSingleNode("Books/Book"); //查找单一节点 5 xnl.RemoveAll(); //删除全部 6 doc.Save("Books.xml"); 7 Console.ReadKey();
LinqToXml
1 //兼容传统方法创建 2 XDocument xDoc = new XDocument(); 3 //xDoc.Declaration = new XDeclaration() 默认UTF-8 第一行不需要单独建 4 XElement xRoot = new XElement("root", "值"); //定义元素 5 6 XElement xRoot1 = new XElement("root1"); //定义元素2 7 xRoot1.Value = "值1"; 8 9 XAttribute xattr = new XAttribute("Id", "1"); //定义属性 10 11 xDoc.Add(xRoot); //统一使用add添加 12 xRoot.Add(xattr); 13 14 xDoc.Save(@"d:\linqtoxml.xml"); 15 16 //真正的linq语法 17 //F# 函数式编程语言 18 new XDocument( 19 new XElement("root", 20 new XAttribute("id", "001"), 21 "值") 22 ).Save(@"d:\2.xml"); 23 //链式编程,流水线生产 f1().f2().f3()... 24 25 //查找xml 26 XDocument xdoc = new XDocument(new XElement("root"));//根节点 27 xdoc.Root.Add(new XElement("person", 28 new XAttribute("id", "1"), 29 new XAttribute("name", "zhangsan"), 30 new XAttribute("sex", "1") 31 )); //添加子节点 32 xdoc.Root.Add(new XElement("person", 33 new XAttribute("id", "2"), 34 new XAttribute("name", "lisi"), 35 new XAttribute("sex", "2") 36 )); 37 xdoc.Save(@"d:\2.xml"); 38 39 <?xml version="1.0" encoding="utf-8"?> 40 <root> 41 <person id="1" name="zhangsan" sex="1" /> 42 <person id="2" name="lisi" sex="2" /> 43 </root> 44 45 //开始查找、修改、删除 46 47 XDocument xdoc = XDocument.Load(@"d:\2.xml"); //加载xml 48 foreach (XElement xlt in xdoc.Root.Elements()) //Root根节点 Elements 元素集合 49 { 50 if (xlt.Name.LocalName == "person") //Name节点名 LocalName不带命名空间的节点名 51 { 52 if (xlt.Attribute("id").Value == "1") //判断属性值为1时 53 { 54 Response.Write(xlt.Attribute("name").Value); //输出name 55 xlt.Attribute("name").Value = "newname"; //修改name 56 xlt.Remove(); //删除此节点 57 xdoc.Save(@"d:2.xml"); 58 } 59 } 60 } 61 62 //Linq查询语法 63 //Descendants()所有子节点 可加某节点下所有节点 64 var query = from s in xdoc.Descendants() //从集合里找 65 where s.Name.LocalName == "person" 66 select s; 67 foreach (XElement xlt in query) 68 { 69 Response.Write(xlt.Value); 70 } 71 72 //Linq方法语法(lambda表达式) 73 foreach (XElement xlt in xdoc.Descendants().Where(s => 74 { 75 if (s.Name.LocalName == "name") 76 { 77 return true; 78 } 79 return false; 80 })) 81 { 82 Response.Write(xlt.Value); 83 }
委托
使用delegate定义委托,将一个方法作为参数传给另一个方法。
委托所指向的函数必须返回值与参数相同
1 /// <summary> 2 /// 委托语法 3 /// </summary> 4 class Program 5 { 6 public delegate void delSayhi(string name); //定义委托 7 static void Main(string[] args) 8 { 9 delSayhi del = new delSayhi(sayHiChinese); //实例化委托调用具体方法 10 del("san"); //执行 11 12 delSayhi del1 = sayHiChinese; //直接赋值方式 13 del1("si"); 14 15 //匿名函数 16 delSayhi del2 = delegate(string name) { Console.WriteLine(name + ",思密达"); }; 17 del2("韩国"); 18 19 //lambda表达式 ()没参数也要写 => { //方法体 } 没参数可以e=> Console.WriteLine(""); 如果只有一句话不用{} 返回的return可以省略 20 delSayhi del3 = (string name) => { Console.WriteLine(name + ",萨瓦迪卡"); }; 21 del2("泰国"); 22 23 sayHi("david", sayHiEnglish); //调用自定义方法 参数要调用的方法 24 Console.ReadKey(); 25 } 26 27 public static void sayHi(string name, delSayhi del) //定义方法 类型委托 28 { 29 del(name); 30 } 31 32 public static void sayHiChinese(string name) 33 { 34 Console.WriteLine("你好, 我叫" + name); 35 } 36 public static void sayHiEnglish(string name) 37 { 38 Console.WriteLine("hello, my name is {0}, nice to meet you!", name); 39 } 40 } 41 42 43 44 /// <summary> 45 /// 求任意数组最大值 46 /// </summary> 47 class Program 48 { 49 public delegate int delCompre(object o1, object o2); //定义比较委托 50 static void Main(string[] args) 51 { 52 //比较int 53 object[] objs = new object[] { 1, 2, 3, 4, 5, 32, 1, 243, }; 54 var max = getMax(objs, getIntMax); //传入比较int方法 55 Console.WriteLine(max); 56 57 var max2 = getMax(objs, delegate(object o1, object o2) 58 { 59 return int.Parse(o1.ToString()) - int.Parse(o2.ToString()); 60 }); //匿名函数 与比较int一样 61 Console.WriteLine(max2); 62 63 //比较string 64 object[] strs = new object[] { "abc", "efd", "asdf", "sd", "asdff" }; 65 var maxstrs = getMax(strs, delegate(object o1, object o2) 66 { 67 return o1.ToString().Length - o2.ToString().Length; 68 }); //匿名函数 69 Console.WriteLine(maxstrs); 70 71 var maxstrs2 = getMax(strs, (object o1, object o2) => 72 { 73 return o1.ToString().Length - o2.ToString().Length; 74 }); //lambda 表达式 75 Console.WriteLine(maxstrs2); 76 77 Console.ReadKey(); 78 } 79 80 public static int getIntMax(object o1, object o2) //比较int方法 81 { 82 int n1 = int.Parse(o1.ToString()); 83 int n2 = int.Parse(o2.ToString()); 84 return n1 - n2; 85 } 86 /// <summary> 87 /// 取一个任意数组的最大值 88 /// </summary> 89 /// <param name="objs">数组</param> 90 /// <param name="del">委托</param> 91 /// <returns></returns> 92 public static object getMax(object[] objs, delCompre del) 93 { 94 object max = objs[0]; 95 for (int i = 0; i < objs.Length; i++) 96 { 97 //if (max < objs[i]) object 无法确定是什么类型 所以不能用< 98 if (del(max, objs[i]) < 0) //如果委托值小于0 成立 传入如何比较即可 99 { 100 max = objs[i]; 101 } 102 } 103 return max; 104 } 105 } 106 107 108 /// <summary> 109 /// 泛型<T>委托 110 /// </summary> 111 class Program 112 { 113 public delegate int delCompre<T>(T t1, T t2); //定义泛型委托 114 static void Main(string[] args) 115 { 116 //int 117 int[] nums = { 1, 2, 3, 4, 5 }; 118 int max = getMax<int>(nums, (int t1, int t2) => { return t1 - t2; }); 119 Console.WriteLine(max); 120 121 //string 122 string[] strs = { "asd", "sdf", "zxcvv", "123", "qwe" }; 123 string maxStr = getMax(strs, (string s1, string s2) => { return s1.Length - s2.Length; }); 124 Console.WriteLine(maxStr); 125 126 Console.ReadKey(); 127 } 128 129 public static T getMax<T>(T[] objs, delCompre<T> del) 130 { 131 T max = objs[0]; 132 for (int i = 0; i < objs.Length; i++) 133 { 134 if (del(max, objs[i]) < 0) 135 { 136 max = objs[i]; 137 } 138 } 139 return max; 140 } 141 }