XML在平常生活中用得很多,它的结构很简单,跟windows explorer有点像。

对它进行操作主要有三种方式:XmlDocument,

假设有这么一个XML文件Book.XML

 <?xml version="1.0" encoding="utf-8"?>
 <bookstore>
   <!--记录书本的信息-->
   <book Type="必修课" ISBN="7-11-19149-2">
     <title>数据结构</title>
     <author>严蔚敏</author>
     <price>30.00</price>
   </book>
   <book Type="必修课" ISBN="7-111-19149-3">
     <title>路由型与交换型互联网基础</title>
     <author>程青梅</author>
     <price>27.00</price>
   </book>
   <book Type="必修课" ISBN="7-111-19149-4">
     <title>计算机硬件技术基础</title>
     <author>李基灿</author>
     <price>25.00</price>
   </book>
   <book Type="必修课" ISBN="7-111-19149-5">
     <title>软件质量保证与管理</title>
     <author>朱少敏</author>
     <price>39.00</price>
   </book>
   <book Type="必修课" ISBN="7-111-19149-6">
     <title>算法设计与分析</title>
     <author>王红梅</author>
     <price>23.00</price>
   </book>
   <book Type="选修课" ISBN="7-111-19149-1">
     <title>计算机操作系统</title>
     <author>林美苏</author>
     <price>28.00</price>
   </book>
 </bookstore>

再定义一个BookModel类

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;

 namespace ConsoleTest
 {
     public class BookModel
     {
         public BookModel()
         {
         }

         private string bookType;
         public string BookType
         {
             get { return bookType; }
             set { bookType = value; }
         }

         private string bookISBN;
         public string BookISBN
         {
             get { return bookISBN; }
             set { bookISBN = value; }
         }

         private string bookName;
         public string BookName
         {
             get { return bookName; }
             set { bookName = value; }
         }

         private string bookAuthor;
         public string BookAuthor
         {
             get { return bookAuthor; }
             set { bookAuthor = value; }
         }

         private double bookPrice;
         public double BookPrice
         {
             get { return bookPrice; }
             set { bookPrice = value; }
         }
     }
 }

1. XmlDocument

分别演示了读取,增加,修改和删除

2. 用XmlTextReader和XmlTextWriter

XmlTextWriter要覆盖原来的文件,显得很麻烦,这里就不写了

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Xml;
 using System.Xml.Linq;

 namespace ConsoleTest
 {
     public class Program
     {
         static private void showXmlInfo(string path)
         {
             XmlDocument doc = new XmlDocument();
             XmlReaderSettings settings = new XmlReaderSettings();
             settings.IgnoreComments = true;
             XmlReader reader = XmlReader.Create(path, settings);
             doc.Load(reader);

             XmlNode xn = doc.DocumentElement;
             XmlNodeList xnl = xn.ChildNodes;
             List<BookModel> bookModelList = new List<BookModel>();
             foreach (XmlNode xmlNode in xnl)
             {
                 BookModel bookModel = new BookModel();
                 XmlElement xe = (XmlElement)xmlNode;
                 bookModel.BookISBN = xe.GetAttribute("ISBN").ToString();
                 bookModel.BookType = xe.GetAttribute("Type").ToString();
                 XmlNodeList xnlChild = xe.ChildNodes;
                 bookModel.BookName = xnlChild.Item().InnerText;
                 bookModel.BookAuthor = xnlChild.Item().InnerText;
                 bookModel.BookPrice = Convert.ToDouble(xnlChild.Item().InnerText);
                 bookModelList.Add(bookModel);
             }
             foreach (BookModel book in bookModelList)
             {
                 Console.WriteLine("Book ISBN: {0}   Type: {1}", book.BookISBN, book.BookType);
                 Console.WriteLine("\tBookName: {0}", book.BookName);
                 Console.WriteLine("\tBookAuthor: {0}", book.BookAuthor);
                 Console.WriteLine("\tBookPrice: {0}", book.BookPrice);
             }
             reader.Close();
         }

         static private void showXmlInfoByTextReader(string path)
         {
             XmlTextReader reader = new XmlTextReader(path);
             List<BookModel> modelList = new List<BookModel>();
             BookModel model = new BookModel();
             while (reader.Read())
             {
                 if (reader.NodeType == XmlNodeType.Element)
                 {
                     if (reader.Name == "book")
                     {
                         model.BookType = reader.GetAttribute();
                         model.BookISBN = reader.GetAttribute();
                     }
                     if (reader.Name == "title")
                     {
                         model.BookName = reader.ReadElementString().Trim();
                     }
                     if (reader.Name == "author")
                     {
                         model.BookAuthor = reader.ReadElementString().Trim();
                     }
                     if (reader.Name == "price")
                     {
                         model.BookPrice = Convert.ToDouble(reader.ReadElementString().Trim());
                     }
                 }
                 if (reader.NodeType == XmlNodeType.EndElement)
                 {
                     modelList.Add(model);
                     model = new BookModel();
                 }
             }
             modelList.RemoveAt(modelList.Count - );
             foreach (BookModel book in modelList)
             {
                 Console.WriteLine("Book ISBN: {0}   Type: {1}", book.BookISBN, book.BookType);
                 Console.WriteLine("\tBookName: {0}", book.BookName);
                 Console.WriteLine("\tBookAuthor: {0}", book.BookAuthor);
                 Console.WriteLine("\tBookPrice: {0}", book.BookPrice);
             }
             reader.Close();
         }

         static void Main(string[] args)
         {
             const string PATH = @"C:\Users\Administrator\Desktop\Demo\Book.XML";

             Console.WriteLine("Read by XmlDocument...\n");
             showXmlInfo(PATH);

             Console.WriteLine("\nRead by XmlTextReader...\n");
             showXmlInfoByTextReader(PATH);

             XmlDocument doc = new XmlDocument();
             doc.Load(PATH);
             XmlNode root = doc.DocumentElement;

             XmlElement xelKey = doc.CreateElement("book");
             xelKey.SetAttribute("Type", "选修课");
             xelKey.SetAttribute("ISBN", "7-111-19149-7");

             XmlElement xelTitle = doc.CreateElement("title");
             xelTitle.InnerText = "计算机算法与结构";
             XmlElement xelAuthor = doc.CreateElement("author");
             xelAuthor.InnerText = "程晓旭";
             XmlElement xelPrice = doc.CreateElement("price");
             xelPrice.InnerText = "50.00";
             xelKey.AppendChild(xelTitle);
             xelKey.AppendChild(xelAuthor);
             xelKey.AppendChild(xelPrice);

             root.AppendChild(xelKey);
             doc.Save(PATH);
             Console.WriteLine("\nApending one child by XmlDocument...\n");
             showXmlInfo(PATH);

             xelKey.GetElementsByTagName().InnerText = ".NET深入浅出";
             xelKey.GetElementsByTagName().InnerText = "冯小兵";
             xelKey.GetElementsByTagName().InnerText = "49.00";
             doc.Save(PATH);

             Console.WriteLine("\nEditting one child...\n");
             showXmlInfo(PATH);

             xelKey.ParentNode.RemoveChild(xelKey);
             doc.Save(PATH);
             Console.WriteLine("\nRemove one child...\n");
             showXmlInfo(PATH);
         }
     }
 }

用windowsForm的listBox来显示的时候

 using System;
 using System.Collections.Generic;
 using System.ComponentModel;
 using System.Data;
 using System.Drawing;
 using System.Linq;
 using System.Text;
 using System.Windows.Forms;
 using System.Xml;

 namespace WindowsTest
 {
     public partial class Form1 : Form
     {
         const string PATH = @"C:\Users\Administrator\Desktop\Demo\Book.XML";
         public Form1()
         {
             InitializeComponent();
         }

         private void Form1_Load(object sender, EventArgs e)
         {
             XmlDocument doc = new XmlDocument();
             doc.Load(PATH);
             RecurseXmlDocument((XmlNode)doc.DocumentElement, );
         }

         private void RecurseXmlDocument(XmlNode root, int indent)
         {
             if (root == null) return;
             if (root is XmlElement)
             {
                 listBox1.Items.Add(root.Name.PadLeft(root.Name.Length + indent));
                 if (root.HasChildNodes)
                 {
                     RecurseXmlDocument(root.FirstChild, indent + );
                 }

                 if (root.NextSibling != null)
                 {
                     RecurseXmlDocument(root.NextSibling, indent);
                 }

             }
             else if (root is XmlText)
             {
                 string text = ((XmlText)root).Value;
                 listBox1.Items.Add(text.PadLeft(text.Length + indent));
             }
         }
     }
 }

3. 用LINQ

3.0的新发现

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Xml;
 using System.Xml.Linq;

 namespace ConsoleTest
 {
     public class Program
     {
         static private void showXmlInfoByLinq(string path)
         {
             XElement xe = XElement.Load(path);
             IEnumerable<XElement> elements = from ele in xe.Elements("book")
                                              select ele;
             List<BookModel> modelList = new List<BookModel>();
             foreach (var ele in elements)
             {
                 BookModel model = new BookModel();
                 model.BookAuthor = ele.Element("author").Value;
                 model.BookName = ele.Element("title").Value;
                 model.BookPrice = Convert.ToDouble(ele.Element("price").Value);
                 model.BookISBN = ele.Attribute("ISBN").Value;
                 model.BookType = ele.Attribute("Type").Value;
                 modelList.Add(model);
             }
             foreach (BookModel book in modelList)
             {
                 Console.WriteLine("Book ISBN: {0}   Type: {1}", book.BookISBN, book.BookType);
                 Console.WriteLine("\tBookName: {0}", book.BookName);
                 Console.WriteLine("\tBookAuthor: {0}", book.BookAuthor);
                 Console.WriteLine("\tBookPrice: {0}", book.BookPrice);
             }
         }

         static void Main(string[] args)
         {
             const string PATH = @"C:\Users\Administrator\Desktop\Demo\Book.XML";

             Console.WriteLine("\nRead by XmlLinq...\n");
             showXmlInfoByLinq(PATH);

             XElement xe = XElement.Load(PATH);
             XElement record = new XElement(
                 new XElement("book",
                     new XAttribute("Type", "选修课"),
                     new XAttribute("ISBN", "7-111-19149-8"),
                     new XElement("title", "敏捷开发"),
                     new XElement("author", "秦朗"),
                     new XElement("price", 34.00)
                     )
                 );
             xe.Add(record);
             xe.Save(PATH);
             Console.WriteLine("\nApending one child by XmlLinq...\n");
             showXmlInfoByLinq(PATH);

             xe = XElement.Load(PATH);
             IEnumerable<XElement> element = from ele in xe.Elements("book")
                                             where ele.Attribute("ISBN").Value == "7-111-19149-8"
                                             select ele;
             )
             {
                 XElement first = element.First();
                 first.SetAttributeValue("Type", "必修课");
                 first.ReplaceNodes(
                     new XElement("title", "敏捷开发框架"),
                     new XElement("author", "秦明"),
                     new XElement("price", 35.00)
                     );
             }
             xe.Save(PATH);
             Console.WriteLine("\nEditting one child by XmlLinq...\n");
             showXmlInfoByLinq(PATH);

             xe = XElement.Load(PATH);
             IEnumerable<XElement> elements = from ele in xe.Elements("book")
                                              where ele.Attribute("ISBN").Value == "7-111-19149-8"
                                              select ele;
             )
             {
                 elements.First().Remove();
             }
             xe.Save(PATH);
             Console.WriteLine("\nRemoving one child by XmlLinq...\n");
             showXmlInfoByLinq(PATH);
         }
     }
 }
05-01 01:49