zoukankan      html  css  js  c++  java
  • 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、保存
     

     
     
  • 相关阅读:
    访友
    幼儿园分班
    求一个数的平方根
    计数器
    连续数组的最大和
    给定一个权重数组,实现一个带权重的路由策略
    两个超长字符串相加
    参数解析(得到输入参数)
    对字符串中的所有单词进行倒排。
    推荐PHP程序员进阶的好书
  • 原文地址:https://www.cnblogs.com/jilonglv/p/2678115.html
Copyright © 2011-2022 走看看