C# Xml操作

     对xml文件的操作,看过很过博文,里面的和书籍上写的都很类似——简单。因为简单才能阐述得很清晰明了,但实际编程的时候就需要变通能力、或者编程功底。对于之前未接触过的新手来说,可要花上几个小时来消化理解。

     当然对于文件操作的方式有很多种,比如封装一个可序列化的类,然后向本机系列化存档,需要的时候反序列即可得到之前存档的信息。但是该方法存档的是一种特殊的格式,不能用一般的文件打开(比如记事本);xml就可以用记事本打开查看内容,有些特别需要的时候用xml是一个很不错的选择。为了xml新手更快的消化吸收xml文件的操作,同时使自己更容易理解,自己做了这篇博文<涉及比较全,但也不复杂>。

View Code
<books>
  <!--分类(计算机和文学类)-->
  <programmers>
    <!--书籍 计算机书 3本,文学类 1本-->
    <book name="The C++ Programming Language" author="Bjarne Stroustrup">
      <!--系列书籍 版次号,可加上出版时间等额外信息(属性)-->
      <Version added="Special Edition (3rd Edition)" />
    </book>
    <book name="C++ Primer" author="Stanley B. Lippman">
      <Version added="Special Edition (4th Edition)" />
    </book>
    <book name="Professional C# 4.0 and .NET 4" author="Christian Nagel .etc">
      <Version added="Special Edition (7th Edition)" />
    </book>
  </programmers>
  <arts>
    <book name="论语" author="孔子">
    </book>
  </arts>
</books>

  一般用记事本就可以做出上面的xml文件,但是一般人会像自动产生上面的xml文件,对xml文件操作类进行简单的封装就可以实现上面的文件。

     产生上面的xml操作code(需要命名空间 System.Xml):

View Code
        public XmlOperator CreateXml(string rootXml,string pathName)
        {

            XmlOperator doc = new XmlOperator();

            //根目录 由于XmlDocment.Load函数(重载函数在内,我试过两个函数)载入时都需要根元素,故在文件不存在的
            //时候先载入一个xml根元素文件(如下),然后生成需要的xml文件保存为**.xml文件即可
            doc.LoadXml(rootXml);
            //增加 计算机和文学类两种书籍
            XmlNode rootNode = doc.GetNode("books");
            doc.AppendNode(rootNode, doc.CreateNode(System.Xml.XmlNodeType.Element, "programmers", null));
            doc.AppendNode(rootNode, doc.CreateNode(System.Xml.XmlNodeType.Element, "arts", null));

            #region Books
            //计算机类 3本
            XmlNode book1 = doc.CreateNode(System.Xml.XmlNodeType.Element, "book", null);
            doc.SetAttribute(book1, "name", "The C++ Programming Language");
            doc.SetAttribute(book1, "author", "Bjarne Stroustrup");
            //创建版次并加入本书系列
            XmlNode book1v = doc.CreateNode(System.Xml.XmlNodeType.Element, "Version", null);
            doc.SetAttribute(book1v, "added", "Special Edition (3rd Edition)");
            doc.AppendNode(book1, book1v);

            XmlNode book2 = doc.CreateNode(System.Xml.XmlNodeType.Element, "book", null);
            doc.SetAttribute(book2, "name", "C++ Primer");
            doc.SetAttribute(book2, "author", "Stanley B. Lippman");
            XmlNode book2v = doc.CreateNode(System.Xml.XmlNodeType.Element, "Version", null);
            doc.SetAttribute(book2v, "added", "Special Edition (4th Edition)");
            doc.AppendNode(book2, book2v);

            XmlNode book3 = doc.CreateNode(System.Xml.XmlNodeType.Element, "book", null);
            doc.SetAttribute(book3, "name", "Professional C# 4.0 and .NET 4");
            doc.SetAttribute(book3, "author", "Christian Nagel .etc");
            XmlNode book3v = doc.CreateNode(System.Xml.XmlNodeType.Element, "Version", null);
            doc.SetAttribute(book3v, "added", "Special Edition (7th Edition)");
            doc.AppendNode(book3, book3v);

            //文学类 1本
            XmlNode bookart = doc.CreateNode(System.Xml.XmlNodeType.Element, "book", null);
            doc.SetAttribute(bookart, "name", "论语");
            doc.SetAttribute(bookart, "author", "孔子");
            #endregion

            XmlNode nodeBookP = doc.GetNode("books/programmers");
            XmlNode nodeBookA = doc.GetNode("books/arts");
            doc.AppendNode(nodeBookP, book1);
            doc.AppendNode(nodeBookP, book2);
            doc.AppendNode(nodeBookP, book3);

            doc.AppendNode(nodeBookA, bookart);

            doc.Save(pathName);
            return doc;
        }

    查找某一本书(如C++ Primer),并修改其中的属性操作(注意每次修改之后必须保存操作<Save>):

            string pathName = "test.xml";
            string rootXml="<books></books>";
            XmlOperator xml=  CreateXml(rootXml, pathName);
            XmlNodeList programingBooks= xml.GetNodes("books/programmers/book");
            if (programingBooks != null)
            {
                foreach (XmlNode book in programingBooks)
                {
                    if (xml.GetAttribute(book, "name").Equals("C++ Primer"))
                    {
                        xml.SetAttribute(book, "name", "C++ Primer(中文版)");
                    }
                }
            }
            xml.Save(pathName);

      操作结果为:

    <book name="C++ Primer(中文版)" author="Stanley B. Lippman">
      <Version added="Special Edition (4th Edition)" />
    </book>

下面为对xml文件的封装类,封装可以随意的,由于编程功底,封装类不是很perfect。

View Code
 1     public class XmlOperator
 2     {
 3         #region Members
 4         private XmlDocument _doc; 
 5         #endregion
 6 
 7         #region Constructors
 8         public XmlOperator()
 9         {
10             _doc = new XmlDocument();
11         } 
12         #endregion
13 
14         #region Methods
15         public void Load(string pathName)
16         {
17             _doc.Load(pathName);
18         }
19         public void Load(System.IO.Stream inStream)
20         {
21             _doc.Load(inStream);
22         }
23         public void LoadXml(string xml)
24         {
25             _doc.LoadXml(xml);
26         }
27         public XmlNode CreateNode(XmlNodeType nodeType, string nodeName,string namespaceURI)
28         {
29             return _doc.CreateNode(nodeType, nodeName, namespaceURI);
30         }
31         public XmlNode GetNode(string xpath)
32         {
33             return _doc.SelectSingleNode(xpath);
34         }
35         public XmlNode AppendNode(XmlNode parent, XmlNode child)
36         {
37             return parent.AppendChild(child);
38         }
39         public XmlNodeList GetNodes(string xpath)
40         {
41             return _doc.SelectNodes(xpath);
42         }
43         public XmlAttribute CreateAttribute(string name)
44         {
45             return _doc.CreateAttribute(name);
46         }
47         public void SetAttribute(XmlNode node, string name, string attriValue)
48         {
49             if (node.Attributes[name] == null)
50             {
51                 XmlAttribute attri= CreateAttribute(name);
52                 AppendAttribute(node, attri);
53             }
54             node.Attributes[name].Value = attriValue;
55         }
56         public XmlAttribute AppendAttribute(XmlNode node, XmlAttribute attri)
57         {
58             return node.Attributes.Append(attri);
59         }
60         public string GetAttribute(XmlNode node, string name)
61         {
62             return (node.Attributes[name]!=null)?node.Attributes[name].Value:null;
63         }
64         public void Save(string pathName)
65         {
66             _doc.Save(pathName);
67         }
68         #endregion
69 
70     }

 特别的:SelectSingleNode还可以按属性值查找格式为:[xpath[@属性名='属性值']]

例如查找 book节点下为name属性为C++ Primer的节点;

eg. _doc.SelectSingleNode("books/programmers/book[@name='C++ Primer'])(只能以绝对路径,不能以相对路径查找;

即当节点在programmers也不能以book[@name='C++ Primer']去查找,必须以books/programmers/book[@name='C++ Primer'])

       总结: xml操作一般步骤:

        1、新建XmlDocment对象

        2、Load或LoadXml文件

        3、对各个Node或Attribute操作(对于该部分操作,最好不要光看代码,这样很容易把自己搞晕掉;结合xml结构写code更清晰明了)

        4、保存
 

 
 
原文地址:https://www.cnblogs.com/jilonglv/p/2678115.html