1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using System.Threading.Tasks;
6 using System.Xml.Linq;
7 using System.Xml;
8 using System.Xml.Serialization;
9 using System.IO;
10
11 namespace XMLFileOperator
12 {
13 class Program
14 {
15
16
17 static void Main(string[] args)
18 {
19 //XmlWriteXMLDocument();
20 //XmlReadXMLDocument();
21 //XmlSerialization();
22 //LinqToXmlOperator();
23 // LinqToXmlOperatorAtString();
24
25 }
26
27 /// <summary>
28 /// Dom中的XDocument
29 /// </summary>
30 public static void XmlWriteXDocument()
31 {
32 #region XML写入
33 //1.创建一个XDocument
34 //创建一个空文档对象
35 XDocument document = new XDocument();
36
37 //1.1创建一个文档声明
38 XDeclaration xDec = new XDeclaration("1.0", "gb2312", "yes");
39 //定义文档不能通过Add()增加,需要设置Declaration属性
40 //document.Add(xDec);
41 document.Declaration = xDec;
42
43 //1.2创建一个根节点
44 XElement rootElement = new XElement("Order");
45 //把根节点加到文档中
46 document.Add(rootElement);
47
48 //1.3增加一个CustomerName节点
49 XElement cstNameElement = new XElement("CustomerName");
50 cstNameElement.SetValue("name1");
51 //把其他节点要加到根节点下
52 rootElement.Add(cstNameElement);
53
54 //1.4增加一个OrderNumber节点
55 //通过调用SetElementValue的方式增加一个元素
56 rootElement.SetElementValue("OrderNumber", "BJ200888");
57
58 //1.5创建一个新对象,Items节点
59 XElement itemElement = new XElement("Items");
60 rootElement.Add(itemElement);
61 //创建3个OrderItem节点
62 XElement orderItemElement1 = new XElement("OrderItem");
63 orderItemElement1.SetAttributeValue("Name", "computer");
64 orderItemElement1.SetAttributeValue("Count", "30");
65
66 XElement orderItemElement2 = new XElement("OrderItem");
67 orderItemElement2.SetAttributeValue("Name", "teletvision");
68 orderItemElement2.SetAttributeValue("Count", "2");
69
70 XElement orderItemElement3 = new XElement("OrderItem");
71 orderItemElement3.SetAttributeValue("Name", "classes");
72 orderItemElement3.SetAttributeValue("Count", "22");
73 itemElement.Add(orderItemElement1);
74 itemElement.Add(orderItemElement2);
75 itemElement.Add(orderItemElement3);
76 //把这个空文档对象写入到xml文件中
77 document.Save("orders.xml");
78 Console.WriteLine("ok");
79 Console.ReadKey();
80 #endregion
81
82 #region XML写入2
83
84 //List<Person> list = new List<Person>()
85 //{
86 // new Person() {Name = "lsx",Age=20,Email="lsx@yahoo.com"},
87 // new Person() {Name = "name1",Age=15,Email="name1@yahoo.com"},
88 // new Person() {Name = "name2",Age=17,Email="name2@yahoo.com"},
89 // new Person() {Name = "name3",Age=19,Email="name3@yahoo.com"},
90 // new Person() {Name = "name4",Age=16,Email="name4@yahoo.com"},
91 // new Person() {Name = "name5",Age=19,Email="name5@yahoo.com"}
92 //};
93
94 ////1.创建一个document对象
95 //XDocument document = new XDocument();
96
97 ////2.设置文档定义
98 //document.Declaration = new XDeclaration("1.0", "gb2312", "yes");
99
100 ////3.增加根节点
101 //XElement rootElement = new XElement("list");
102
103 ////遍历list集合,有几个元素对象就创建几个子节点
104 //foreach (Person item in list)
105 //{
106 // XElement personElement = new XElement("Person");
107 // personElement.SetElementValue("Name", item.Name);
108 // personElement.SetElementValue("Age", item.Age);
109 // personElement.SetElementValue("Email", item.Email);
110
111 // //把当前的节点PersonElement,加到根节点下
112 // rootElement.Add(personElement);
113 //}
114
115 ////为文档增加根节点
116 //document.Add(rootElement);
117
118 //rootElement.SetAttributeValue("Count", list.Count);
119
120 ////需要把document这个文档对象写入到文件中
121 //document.Save("../list.xml");
122
123 //Console.WriteLine("ok");
124
125 #endregion
126 }
127
128 /// <summary>
129 /// Dom中的XDocument
130 /// </summary>
131 public static void XmlReadXDocument()
132 {
133 #region 读取list.xml文件
134 //1.创建一个Dom对象
135 XDocument document = XDocument.Load("list.xml");
136 //2.一定要找到根节点
137 XElement rootElement = document.Root;
138
139 //判断是否有属性
140 Console.WriteLine(rootElement.Name);
141 //调用输出元素属性的方法
142 PrintAttributes(rootElement);
143
144 //Console.WriteLine(rootElement.Name.ToString());
145 //2.1获取根节点下的所有子节点
146 /*
147 *不传参数,表示获取根节点下的所有的子元素
148 *如果为Elements()方法传递参数,则表示要获取当前节点下的
149 *所有名字为参数中给定的名字的那些子元素
150 */
151 //只要返回类型是IEnumerable接口类型的,无论是泛型还是非泛型的都可以在foreach中遍历
152 foreach (XElement element in rootElement.Elements())
153 {
154 //这个循环就是遍历根元素下的每个子元素
155 //Console.WriteLine(element.Name);
156 Console.WriteLine("节点=================={0}", element.Name);
157 PrintAttributes(element);
158 foreach (var subElement in element.Elements())
159 {
160 Console.WriteLine("子节点====={0}::{1}", subElement.Name, subElement.Value);
161 PrintAttributes(subElement);
162 }
163 }
164 Console.ReadKey();
165 #endregion
166 }
167
168 /// <summary>
169 /// Dom中的XmlDocument
170 /// </summary>
171 public static void XmlWriteXMLDocument()
172 {
173 //1.创建一个空的XML文档
174 XmlDocument xmlDoc = new XmlDocument();
175
176 //2.在XML的文档的最头部加入XML的声明段落,即创建一个声明类型的节点
177 XmlNode xmlNode = xmlDoc.CreateNode(XmlNodeType.XmlDeclaration, "", "");
178 xmlDoc.AppendChild(xmlNode);
179
180 //3.增加注释
181 XmlComment xmlCom = xmlDoc.CreateComment("这是XML文档的注释内容");
182 xmlDoc.AppendChild(xmlCom);
183
184 //4.为XML文档加入一个元素/加入一个根元素
185 XmlElement xmlelem = xmlDoc.CreateElement("", "Student", "");
186 //XmlText xmlText = xmlDoc.CreateTextNode("Root Text");
187 //xmlelem.AppendChild(xmlText);
188
189 //5.增加一个属性
190 XmlAttribute xmlAttr = xmlDoc.CreateAttribute("Professional");
191 xmlAttr.Value = "Computer";
192 xmlelem.Attributes.Append(xmlAttr);
193 xmlDoc.AppendChild(xmlelem);
194
195 //6.增加一个子元素
196 XmlElement xmlelem2 = xmlDoc.CreateElement("Name");
197 XmlText xmltext = xmlDoc.CreateTextNode("name1");
198 xmlelem2.AppendChild(xmltext);
199 xmlelem.AppendChild(xmlelem2);
200
201 XmlElement xmlelem3 = xmlDoc.CreateElement("Sex");
202 XmlText xmltext2 = xmlDoc.CreateTextNode("Man");
203 xmlelem3.AppendChild(xmltext2);
204 xmlelem.AppendChild(xmlelem3);
205
206 try
207 {
208 xmlDoc.Save("test.xml");
209 }
210 catch (Exception ex)
211 {
212 Console.WriteLine(ex.Message);
213 }
214 }
215
216 /// <summary>
217 /// Dom中的XmlDocument
218 /// </summary>
219 public static void XmlReadXMLDocument()
220 {
221 //1.加载指定的XML文件
222 XmlDocument xDoc = new XmlDocument();
223 xDoc.Load("test.xml");//4 个重载,4种方式加载Xml
224 //载入XmlTextReader类的对象
225 //XmlTextReader reader = new XmlTextReader("test.xml");
226 //xDoc.Load(reader);
227
228
229 //1: xn 代表一个结点
230 //2: xn.Name;//这个结点的名称
231 //3: xn.Value;//这个结点的值
232 //4: xn.ChildNodes;//这个结点的所有子结点
233 //5: xn.ParentNode;//这个结点的父结点
234 //2.读取XML的根节点
235 XmlNode xn = xDoc.SelectSingleNode("Student");
236 //3.根据根节点得到所有的子节点
237 XmlNodeList xnl = xn.ChildNodes;
238
239 }
240
241
242 /*
243 * 所谓序列化,其实就是一个过程,一个将对象的状态信息转换为可以存储或者传输的对象,反序列化就是反过程
244 * 由于XML文件是一个开放的标准,用于不同的用户之间进行数据交换,XML序列化的意义比较大
245 * 另外,关于序列化,我们也可以讲对象的状态信息序列化为二进制数据到磁盘,流,内存,网络,,
246 * 还有javascrip序列化的问题,这三种是比价常见的。
247 */
248 /// <summary>
249 /// XML序列化
250 /// </summary>
251 public static void XmlSerialization()
252 {
253 #region 对象序列化
254 List<PersonClass> li = new List<PersonClass>();
255 li.Add(new PersonClass() { Name = "wuxinlong", Age = 18, Email = "wuxinlong@163.com" });
256 li.Add(new PersonClass() { Name = "Jafh", Age = 14, Email = "Jafh@163.com" });
257 li.Add(new PersonClass() { Name = "hasdf", Age = 35, Email = "hasdf@163.com" });
258 //使用XML序列化对象
259 XmlSerializer xmlSerializer = new XmlSerializer(li.GetType()/*typeof(list<PersonClass>)*/);
260 //创建一个文件流,序列化时需要将该流的数据序列化为xml文件
261 //xmlSerializer.Serialize(Stream,object);
262
263 using (FileStream fsWrite = File.OpenWrite("li.xml"))
264 {
265 xmlSerializer.Serialize(fsWrite, li);
266 //xmlSerializer.Deserialize(fsWrite);
267 }
268 Console.WriteLine("ok");
269 Console.ReadKey();
270 #endregion
271
272 }
273
274 //LinqToXML是Linq系列中的一个主题,Linq用来操作内存数据比较方便简单,代码量比较少
275 //在操作XML文件的时候类似数据的增删改查
276 public static void LinqToXmlOperator()
277 {
278 #region 创建XML文档 格式固定
279 XDocument inventDoc =
280 new XDocument(
281 new XDeclaration("1.0", "utf-8", "yes"),
282 new XComment("这是一份用Linq创建的XML文档"),
283 new XProcessingInstruction("xml-stylesheet",
284 "href='MyStyles.css' title='Compact' type='text/css'"),
285 new XElement("Invent",
286 new XElement("car", new XAttribute("ID", "1"),
287 new XElement("Color", "Green"),
288 new XElement("Mark", "BMW"),
289 new XElement("PetName", "Stan")
290 ),
291 new XElement("car", new XAttribute("ID", "2"),
292 new XElement("Color", "Pink"),
293 new XElement("Mark", "Yugo"),
294 new XElement("PetName", "Melvin")
295 )
296 )
297 );
298 //保存
299 inventDoc.Save("inventDoc.xml");
300 #endregion
301 }
302
303 /// <summary>
304 /// 通过数组生成XML文档
305 /// </summary>
306 public static void LinqToXmlOperatorAtArray()
307 {
308 #region 从数组和容器中生成文档
309 //实际意义比较大,因为我们在实际中获取数据绝大多数方式是通过数组,ADO.NET,对象和文件获取的
310 //创建匿名类型的数组
311 var people = new[]
312 {
313 new {FirstName="Mandy",Age=32},
314 new {FirstName="wuxinlong",Age=18},
315 new {FirstName="Moto",Age=15},
316 new {FirstName="Jack",Age=40},
317 new {FirstName="Marry",Age=22},
318 };
319
320 var arrayDataAsXElements = from c in people
321 select
322 new XElement("Person",
323 new XAttribute("Age", c.Age),
324 new XAttribute("FirstName", c.FirstName)
325 );
326 XElement peopleDoc = new XElement("People", arrayDataAsXElements);
327 peopleDoc.Save("People.xml");
328 Console.WriteLine(peopleDoc);
329 Console.ReadKey();
330 #endregion
331 }
332
333 //通过字符串生成XML,对字符串的要求比较严格
334 public static void LinqToXmlOperatorAtString()
335 {
336 string myElement =
337 @"<Car ID='3'>
338 <Color>Bule</Color>
339 <Make>Yugo</Make>
340 </Car>";
341 XElement newElement = XElement.Parse(myElement);
342 newElement.Save("newElement.xml");
343 Console.WriteLine(newElement);
344 Console.ReadKey();
345 }
346
347 private static void PrintAttributes(XElement rootElement)
348 {
349 Console.WriteLine(rootElement.Name + "元素的属性:");
350 foreach (XAttribute attr in rootElement.Attributes())
351 {
352 Console.WriteLine(attr.Name + " " + attr.Value);
353 }
354 }
355 }
356
357 public class Person
358 {
359 public string Name { get; set; }
360 public int Age { get; set; }
361 public string Email { get; set; }
362 }
363
364 //创建一个对象,用来进行序列化操作
365 //注意xml序列化只能序列化公共字段和属性
366 //而且对象也必须是公共类型
367 public class PersonClass
368 {
369 public string Name { get; set; }
370 public int Age { get; set; }
371 public string Email { get; set; }
372 public void SayHi()
373 {
374 Console.WriteLine("Hi,MyName is:{0}",Name);
375 }
376 public void SayHello()
377 {
378 Console.WriteLine("Hello");
379 }
380 }
381 }