C#操作XML文档总结

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#操作XML文档总结相关的知识,希望对你有一定的参考价值。

包括XMLWriter写入,XmlReader读取,XmlDocument操作,DataSet.ReadXML(),DataSet.WriteXML(),LINQ查询XML

1.XMLWriter写入XML数据

  结果会覆盖原文档。

c#_code:

            //使用XMLWriter写XML数据
            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Indent = true; //缩进
            //settings.NewLineOnAttributes = true; //属性换新的一行
            XmlWriter writer = XmlWriter.Create("Books.xml", settings);//创建XmlWriter实例
            writer.WriteStartDocument();//XML文档声明
            writer.WriteStartElement("book"); //开始标记 1
            writer.WriteAttributeString("Type","科幻");//添加属性
            writer.WriteAttributeString("ISBN", "001-001-001");//添加属性
            writer.WriteElementString("title", "名侦探柯南");//添加元素
            writer.WriteElementString("price", "99.99");//添加元素
            writer.WriteStartElement("author");//开始标记 2
            writer.WriteElementString("name", "谁谁谁");//添加元素
            writer.WriteEndElement();//结束标记 2
            writer.WriteEndElement();//结束标记 1
            writer.WriteEndDocument(); //关闭所有文档标记
            writer.Flush(); //刷新流
            writer.Close(); //关闭流                    

结果如下:

<?xml version="1.0" encoding="utf-8"?>
<book Type="科幻" ISBN="001-001-001">
  <title>名侦探柯南</title>
  <price>99.99</price>
  <author>
    <name>谁谁谁</name>
  </author>
</book>

 

2.XMLReader读取XML数据

xml_data:

<?xml version="1.0" encoding="utf-8"?>
<book Type="科幻" ISBN="001-001-001">
  <title>哈利波特</title>
  <price>99.99</price>
  <author>
    <name>JK罗琳</name>
  </author>
</book>
<book Type="青春" ISBN="001-001-002">
  <title>左耳</title>
  <price>9.99</price>
  <author>
    <name>饶雪漫</name>
  </author>
</book>
<book Type="悬疑" ISBN="001-001-003">
  <title>盗墓笔记</title>
  <price>99.99</price>
  <author>
    <name>南派三叔</name>
  </author>
</book>

c#_code:

此处待续。。。。

 

3.XmlDocument操作XML

(1)插入节点,在原文档下追加,原文档必须要有根元素 <Books></Books>。

c#_code:

            XmlDocument doc = new XmlDocument();
            doc.Load("D:\\Books.xml");//加载XML文档,文件必须存在且有根元素
            //创建一个节点
            XmlElement newbook = doc.CreateElement("book");
            //设置属性
            newbook.SetAttribute("type", "story");
            newbook.SetAttribute("publishdate", "1993");
            newbook.SetAttribute("ISBN", "002-123-321");
            //设置元素
            XmlElement name = doc.CreateElement("Name");
            name.InnerText = "I have a Dream";
            newbook.AppendChild(name);
            XmlElement price = doc.CreateElement("Price");
            price.InnerText = "9.99";
            newbook.AppendChild(price);
            //添加到节点
            doc.DocumentElement.AppendChild(newbook);
            //写入磁盘(追加)
            XmlTextWriter tr = new XmlTextWriter("D:\\Books.xml", null);
            tr.Formatting = Formatting.Indented;//设置缩进格式
            doc.WriteContentTo(tr);//保存 写入
            tr.Close();        

结果如下:

<?xml version="1.0" encoding="utf-8"?>
<Books>
  <book type="story" publishdate="1993" ISBN="002-123-321">
    <Name>I have a Dream</Name>
    <Price>9.99</Price>
  </book>
</Books>

 

(2)XmlDocument读取某个节点的元素

xml_data:

<?xml version="1.0" encoding="utf-8"?>
<bookstore>
    <book Type="科幻" ISBN="001-001-001">
      <title>哈利波特</title>
      <price>99.99</price>
      <author>
        <name>JK罗琳</name>
      </author>
    </book>
    <book Type="青春" ISBN="001-001-002">
      <title>左耳</title>
      <price>9.99</price>
      <author>
        <name>饶雪漫</name>
      </author>
    </book>
    <book Type="悬疑" ISBN="001-001-003">
      <title>盗墓笔记</title>
      <price>99.99</price>
      <author>
        <name>南派三叔</name>
      </author>
    </book>
</bookstore>

c#_code:

            XmlDocument doc = new XmlDocument();
            doc.Load("D:\\Books.xml");
            //输出所有节点为Name的元素
            //1.
            XmlNodeList nodelist = doc.GetElementsByTagName("title");
            //2.使用XPath语法从文档中检索一组节点
            //XmlNodeList nodelist = doc.SelectNodes("/bookstore/book/title");
            foreach (XmlNode node in nodelist)
            {
                richTextBox1.AppendText(node.InnerXml + "\r\n");
            }

读取结果:

    哈利波特
    左耳
    盗墓笔记

(2)XMLDocument获取指定节点的元素

 

4.XML文档与ADO.NET对象相互转换

适用于版本.NET3.0以上

    using System.Data;
    using System.Xml;
    using System.Data.SqlClient;
    using System.Xml.Linq;

            string connString = "server=服务器名;database=数据库;uid=账户;pwd=密码";
            ///ADO.NET数据转换XML文档
            //1:创建一个ADO.NET对象,生成一个DataSet对象
            SqlConnection conn = new SqlConnection(connString);
            SqlDataAdapter dataAdapter1 = new SqlDataAdapter("select Barcode from Books", conn);
            DataSet dataSet1 = new DataSet();
            dataAdapter1.Fill(dataSet1, "BooksBarCode");
            //2:把XML文档存到磁盘中(覆盖数据)
            string file = @"C:\Users\WIN20150720\Desktop\Books.xml";
            dataSet1.WriteXml(file);


            ///XML文档转换ADO.NET数据
            //1:创建DataSet对象
            DataSet dataSet2 = new DataSet();
            //2:读取XML文档
            dataSet2.ReadXml(file);
            //3:绑定到网格
            dataGridView1.DataSource = dataSet2.Tables[0];

            ///SQL从数据库查询
            //根据BarCode获取全部信息
            string barcode = "";
            foreach (DataRow dr in dataSet2.Tables[0].Rows)
            {
                barcode += dr["Barcode"].ToString() + ",";
            }
            barcode = barcode.Substring(0, barcode.LastIndexOf(","));
            string sql = string.Format("Select * from Books where BarCode in({0})", barcode);
            SqlDataAdapter dataAdapter2 = new SqlDataAdapter(sql, conn);
            DataSet dataSet3 = new DataSet();
            dataAdapter2.Fill(dataSet3, "BooksInfo");
            string file2 = @"C:\Users\WIN20150720\Desktop\AllBooks.xml";
            dataSet3.WriteXml(file2);

 

5.LINQ从XML文档查询

(1)

data_xml:

<?xml version="1.0" encoding="utf-8" ?>
<Data>
  <Products>
    <Product Name="West Side Story" Price="9.99m" SuppelierID="1"/>
    <Product Name="Assassins" Price="14.99m" SuppelierID="2"/>
    <Product Name="Frogs" Price="13.99m" SuppelierID="1"/>
    <Product Name="Sweeney Todd" Price="9.99m" SuppelierID="3"/>
  </Products>
  <Suppliers>
    <Supplier Name="Solely Sondheim" SupplierID="1"/>
    <Supplier Name="CD-by-CD-by-Sondheim" SupplierID="2"/>
    <Supplier Name="Barbershop CDs" SupplierID="3"/>
  </Suppliers>
</Data>

应用:

using System.Xml.Linq;

namespace ConsoleApplication1
{
    class XML_LINQ
    {
        static void Main()
        {
            //将产品和供货商连接起来,价格高于10美元,先按供货商名排序,在按产品名排序,最后打印供货商名和产品名
            //供货商和产品编码使用XML文件
            XDocument doc = XDocument.Load("data.xml");    //XDocument使用命名空间System.Xml.Linq;
            var filtered = from p in doc.Descendants("Product")
                            join s in doc.Descendants("Supplier")
                            on (int)p.Attribute("SupplierID")
                            equals (int)s.Attribute("SupplierID")
                            where (decimal)p.Attribute("Price") > 10
                            orderby (string)s.Attribute("Name"), (string)p.Attribute("Name")
                            select new
                            {
                                SupplierName = (string)s.Attribute("Name"),
                                ProductName = (string)s.Attribute("Name")
                            };
            foreach (var v in filtered)
            {
                Console.WriteLine("Supplier={0};Product={1}", v.SupplierName, v.ProductName);
            }
        }
    }
}

 

(2)

xml_data:  D:\\Books.xml

<?xml version="1.0" encoding="utf-8"?>
<bookstore>
    <book Type="科幻" ISBN="001-001-001">
      <title>哈利波特</title>
      <price>99.99</price>
      <author>
        <name>JK罗琳</name>
      </author>
    </book>
    <book Type="青春" ISBN="001-001-002">
      <title>左耳</title>
      <price>9.99</price>
      <author>
        <name>饶雪漫</name>
      </author>
    </book>
    <book Type="悬疑" ISBN="001-001-003">
      <title>盗墓笔记</title>
      <price>99.99</price>
      <author>
        <name>南派三叔</name>
      </author>
    </book>
</bookstore>

应用1:根据书名查找价格和作者

       //根据书名查找价格和作者            
       XDocument doc = XDocument.Load("D:\\Books.xml"); var query = from p in doc.Element("bookstore").Elements("book") where (string)p.Element("title") == "左耳" select p; query.ToList().ForEach(item => { decimal price = (decimal)item.Element("price"); string author = item.Element("author").Value; });

结果:price=9.99  author=饶雪漫

 应用2:查找所有的书名

            //查找所有的书名
            XDocument xdoc = XDocument.Load("D:\\Books.xml");
            var query = from title in xdoc.Descendants("title")
                        select title.Value;
            foreach (var item in query)
            {
                richTextBox1.AppendText(item + "\r\n");
            }

结果:   哈利波特

    左耳

    盗墓笔记

 

以上是关于C#操作XML文档总结的主要内容,如果未能解决你的问题,请参考以下文章

C#操作XML的通用方法总结

在 C# 中操作 Word 2007 文档 XML

使用C#进行XML文档读取

XML编程总结——使用DOM接口操作xml

C#程序员经常用到的10个实用代码片段 - 操作系统

C# XML 文档网站链接