zoukankan      html  css  js  c++  java
  • 【转】C#操作XML方法集合

     个人站点地址:nowherewoman.com

    借鉴前人的总结 http://www.cnblogs.com/zery/p/3362480.html

    一 前言

    先来了解下操作XML所涉及到的几个类及之间的关系 如果大家发现少写了一些常用的方法,麻烦在评论中指出,我一定会补上的!谢谢大家

    * 1 XMLElement 主要是针对节点的一些属性进行操作
    * 2 XMLDocument 主要是针对节点的CUID操作
    * 3 XMLNode 为抽象类,做为以上两类的基类,提供一些操作节点的方法

    清楚了以上的关系在操作XML时会更清晰一点

    二 具体操作(C#)

      以下会对Xml的结点与属性做增 删 改 查的操作也满足了实际工作中的大部分情况

    先构造一棵XML树如下,其中也涉及到了写入xml文档的操作

    复制代码

    1 public void CreatXmlTree(string xmlPath)
    2 {
    3 XElement xElement = new XElement(
    4 new XElement("BookStore",
    5 new XElement("Book",
    6 new XElement("Name", "C#入门", new XAttribute("BookName", "C#")),
    7 new XElement("Author", "Martin", new XAttribute("Name", "Martin")),
    8 new XElement("Adress", "上海"),
    9 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))
    10 ),
    11 new XElement("Book",
    12 new XElement("Name", "WCF入门", new XAttribute("BookName", "WCF")),
    13 new XElement("Author", "Mary", new XAttribute("Name", "Mary")),
    14 new XElement("Adress", "北京"),
    15 new XElement("Date", DateTime.Now.ToString("yyyy-MM-dd"))
    16 )
    17 )
    18 );
    19 
    20 //需要指定编码格式,否则在读取时会抛:根级别上的数据无效。 第 1 行 位置 1异常
    21 XmlWriterSettings settings = new XmlWriterSettings();
    22 settings.Encoding = new UTF8Encoding(false);
    23 settings.Indent = true;
    24 XmlWriter xw = XmlWriter.Create(xmlPath,settings);
    25 xElement.Save(xw);
    26 //写入文件
    27 xw.Flush();
    28 xw.Close();
    29 }


    复制代码

    然后得到如下的XML树

    <?xml version="1.0" encoding="utf-8"?>
    <BookStore>
        <Book>
            <Name BookName="C#">C#入门</Name>
            <Author Name="Martin">Martin</Author>
            <Date>2013-10-11</Date>
            <Adress>上海</Adress>
            <Date>2013-10-11</Date>
        </Book>
        <Book>
            <Name BookName="WCF">WCF入门</Name>
            <Author Name="Mary">Mary</Author>
            <Adress>北京</Adress>
            <Date>2013-10-11</Date>
        </Book>
    </BookStore>


    以下操作都是对生成的XML树进行操作

    2.1 新增节点与属性

    新增节点NewBook并增加属性Name="WPF"

    1 public void Create(string xmlPath)
    2 {
    3 XmlDocument xmlDoc = new XmlDocument();
    4 xmlDoc.Load(xmlPath);
    5 
    6 var root = xmlDoc.DocumentElement;//取到根结点
    7 XmlNode newNode = xmlDoc.CreateNode("element", "NewBook", "");
    8 newNode.InnerText = "WPF";
    9 
    10 //添加为根元素的第一层子结点
    11 root.AppendChild(newNode);
    12 xmlDoc.Save(xmlPath);
    13 }


    开篇有写操作xml节点属性主要用XmlElement对象所以取到结点后要转类型

    复制代码

    1 //属性
    2 public void CreateAttribute(string xmlPath)
    3 {
    4 XmlDocument xmlDoc = new XmlDocument();
    5 xmlDoc.Load(xmlPath);
    6 var root = xmlDoc.DocumentElement;//取到根结点
    7 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");
    8 node.SetAttribute("Name", "WPF");
    9 xmlDoc.Save(xmlPath);
    10 
    11 }

    2.2 删除节点与属性

    1 public void Delete(string xmlPath)
    2 {
    3 XmlDocument xmlDoc = new XmlDocument();
    4 xmlDoc.Load(xmlPath);
    5 var root = xmlDoc.DocumentElement;//取到根结点
    6 
    7 var element = xmlDoc.SelectSingleNode("BookStore/NewBook");
    8 root.RemoveChild(element);
    9 xmlDoc.Save(xmlPath);
    10 }

    删除属性

    1 public void DeleteAttribute(string xmlPath)
    2 {
    3 XmlDocument xmlDoc = new XmlDocument();
    4 xmlDoc.Load(xmlPath);
    5 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");
    6 //移除指定属性
    7 node.RemoveAttribute("Name");
    8 //移除当前节点所有属性,不包括默认属性
    9 //node.RemoveAllAttributes();
    10 xmlDoc.Save(xmlPath);
    11 }

    2.3 修改节点与属性

    xml的节点默认是不允许修改的,本文也就不做处理了

    修改属性代码如下

    1 public void DeleteAttribute(string xmlPath)
    2 {
    3 XmlDocument xmlDoc = new XmlDocument();
    4 xmlDoc.Load(xmlPath);
    5 XmlElement node = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");
    6 //移除指定属性
    7 node.RemoveAttribute("Name");
    8 //移除当前节点所有属性,不包括默认属性
    9 //node.RemoveAllAttributes();
    10 xmlDoc.Save(xmlPath);
    11 }

    2.4 获取节点与属性

    1 public void Select(string xmlPath)
    2 {
    3 XmlDocument xmlDoc = new XmlDocument();
    4 xmlDoc.Load(xmlPath);
    5 //取根结点
    6 var root = xmlDoc.DocumentElement;//取到根结点
    7 //取指定的单个结点
    8 XmlNode oldChild = xmlDoc.SelectSingleNode("BookStore/NewBook");
    9 
    10 //取指定的结点的集合
    11 XmlNodeList nodes = xmlDoc.SelectNodes("BookStore/NewBook");
    12 
    13 //取到所有的xml结点
    14 XmlNodeList nodelist = xmlDoc.GetElementsByTagName("*");
    15 }

    属性

    1 public void SelectAttribute(string xmlPath)
    2 {
    3 XmlDocument xmlDoc = new XmlDocument();
    4 xmlDoc.Load(xmlPath);
    5 XmlElement element = (XmlElement)xmlDoc.SelectSingleNode("BookStore/NewBook");
    6 string name = element.GetAttribute("Name");
    7 Console.WriteLine(name);
    8 }

    三 具体操作 (linq to XML)

    Linq to Xml 也没什么变化只操作对象改变了主要涉及的几个对象如下 注:我并没有用linq的语法去操作元素。

    XDocument:用于创建一个XML实例文档

    XElement:用于一些节点与节点属性的基本操作

    以下是对Xml的 一些简单的操作

    3.1 新增节点与属性

    1 public void Create(string xmlPath)
    2 {
    3 XDocument xDoc = XDocument.Load(xmlPath);
    4 XElement xElement = xDoc.Element("BookStore");
    5 xElement.Add(new XElement("Test", new XAttribute("Name", "Zery")));
    6 xDoc.Save(xmlPath);
    7 }

    属性

    1 public void CreateAttribute(string xmlPath)
    2 {
    3 XDocument xDoc = XDocument.Load(xmlPath);
    4 IEnumerable<XElement> xElement = xDoc.Element("BookStore").Elements("Book");
    5 foreach (var element in xElement)
    6 {
    7 element.SetAttributeValue("Name", "Zery");
    8 }
    9 xDoc.Save(xmlPath);
    10 }


    3.2 删除节点与属性

    复制代码
    1 public void Delete(string xmlPath)
    2 {
    3 XDocument xDoc = XDocument.Load(xmlPath);
    4 XElement element = (XElement)xDoc.Element("BookStore").Element("Book");
    5 element.Remove();
    6 xDoc.Save(xmlPath);
    7 }
    复制代码
    属性

    1 public void DeleteAttribute(string xmlPath)
    2 {
    3 XDocument xDoc = XDocument.Load(xmlPath);
    4 //不能跨级取节点
    5 XElement element = xDoc.Element("BookStore").Element("Book").Element("Name");
    6 element.Attribute("BookName").Remove();
    7 xDoc.Save(xmlPath);
    8 }

    3.3 修改节点属性

    节点.net没提供修改的方法本文也不做处理

    修改属性与新增实质是同一个方法

    1 public void ModifyAttribute(string xmlPath)
    2 {
    3 XDocument xDoc = XDocument.Load(xmlPath);
    4 XElement element = xDoc.Element("BookStore").Element("Book");
    5 element.SetAttributeValue("BookName","ZeryTest");
    6 xDoc.Save(xmlPath);
    7 }

    四 总结

      把文章写完时,又扫去了自己的一个盲区,虽然都是些简单的操作,但在实际的开中,又何尝不是由简单到复杂呢。我觉得身为程序员就应该遇到自己的盲区时,立马花时间去了解,不说要了解多深入,但至少基本的还是要知道,等到工作中真需时,只要稍微花点时间就可以了。

    如果觉得文章对你有点帮助,不妨点下推荐,你的推荐让我对写文章能有更多的激情!

    成长在于积累!

  • 相关阅读:
    图解设计模式-Visitor模式
    图解设计模式-Decorator模式
    图解设计模式-Strategy模式
    图解设计模式-Bridge模式
    HashMap源码
    LinkedList源码
    Vector源码
    ArrayList源码
    图解设计模式-Abstract Factory模式
    图解设计模式-Builder模式
  • 原文地址:https://www.cnblogs.com/NowhereWoman/p/3738505.html
Copyright © 2011-2022 走看看