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); } } }