在JSON没流行起来的时候xml一直作为程序存储配置信息的主流介质;特别是小型数据表方面还是不错的选择,所以经常涉及到的操作无非也就是增删改查,这篇博客主要是对这些对比较常用的操作做了个简单的总结

文件加载

SelectNodes()、SelectSingleNode()节点获取大法

创建XML文档及设置元素值

XmlReader与XmlWriter

DataSet与XML数据

Linq to XML

XML序列化与反序列化

文件加载

  • 通过路径加载XML
   XmlDocument xmlDoc = new XmlDocument();
   xmlDoc.Load(fileName);//文件路径或者URL地址
   Console.WriteLine(xmlDoc.InnerXml);
   Console.WriteLine("==============有逼格的分割线================");
   xmlDoc.Load("http://feed.cnblogs.com/blog/picked/rss");//博客园精华帖RSS
   Console.WriteLine(xmlDoc.InnerXml);

  • 通过文件流加载
   using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read))
   {
       XmlDocument xmlDoc = new XmlDocument();
       xmlDoc.Load(stream);
       Console.WriteLine(xmlDoc.InnerXml);
   }

  Load()方法还重载了一些方法,并且还有别的方式可以加载XML文档,比如LoadXml()直接加载一段XML串

SelectNodes()、SelectSingleNode()节点获取大法

<?xml version="1.0" encoding="utf-8" ?>
<Names>
  <Name>
    <FirstName>John</FirstName>
    <LastName>Smith</LastName>
  </Name>
  <Name>
    <FirstName>James</FirstName>
    <LastName>White</LastName>
  </Name>
</Names>

XML文件

  • 通过XPath表达式的SelectNodes(string xpath)方法获取节点列表;SelectSingleNode(string xpath)获取第一个匹配的节点
    XmlNodeList xmlNodes = xmlDoc.SelectNodes("/Names/Name");//第一个斜杠必须是根节点
    foreach (XmlNode item in xmlNodes)
    {
        Console.WriteLine(item.InnerXml);
    }
    Console.WriteLine("==================================");
    XmlNode xmlNode = xmlDoc.SelectSingleNode("/Names/Name");
    Console.WriteLine(xmlNode.InnerXml);
    Console.WriteLine(xmlNode["LastName"].InnerText);//获取子节点

  • 设置节点特性值查找节点
<Root>
  <Item Id="1"  Grade="1">张三</Item>
  <Item Id="2"  Grade="1">李四</Item>
  <Item Id="3"  Grade="2">王五</Item>
  <Item Id="4"  Grade="3">赵六</Item>
</Root>
  XmlNodeList xmlNodes = xmlDoc.SelectNodes("/Root/Item[@Grade='1']");//XPath表达式获取设置要获取节点的特性值信息
  foreach (XmlNode item in xmlNodes)
  {
      Console.WriteLine(item.InnerText);
  }

  • 获取第N个节点
   XmlNode xmlNode = xmlDoc.SelectSingleNode("/Root/Item[position()=3]");//获取第N个节点(根据XML节点的顺序)
   Console.WriteLine(xmlNode.InnerText);
   Console.WriteLine("==============================");
   XmlNodeList xmlNodes = xmlDoc.SelectNodes("/Root/Item[position()<=3]");//获取从第一个到第N个的节点(根据XML节点的顺序
   foreach (XmlNode item in xmlNodes)
   {
       Console.WriteLine(item.InnerText);
   }
   Console.WriteLine("==============================");
   xmlNodes = xmlDoc.SelectNodes("/Root/Item[position() > 2]");//获取大于第N个的节点(根据XML节点的顺序)
   foreach (XmlNode item in xmlNodes)
   {
       Console.WriteLine(item.InnerText);
   }

创建XML文档及设置元素值

   XmlDocument xmlDoc = new XmlDocument();
   XmlNode rootNode = xmlDoc.CreateElement("Root");//创建一个节点
   xmlDoc.AppendChild(rootNode);
   Console.WriteLine(xmlDoc.InnerXml);
   Console.WriteLine("==============有逼格的分割线================");

   XmlNode node = xmlDoc.CreateElement("Item");
   XmlAttribute attribute = xmlDoc.CreateAttribute("Id");//创建节点特性
   attribute.Value = ";//设置特性值
   node.Attributes.Append(attribute);
   node.InnerText = "张三";
   rootNode.AppendChild(node);
   Console.WriteLine(xmlDoc.InnerXml);
   Console.WriteLine("==============有逼格的分割线================");
   node = xmlDoc.CreateElement("Item");
   attribute = xmlDoc.CreateAttribute("Id");
   attribute.Value = ";
   node.Attributes.Append(attribute);
   node.InnerText = "李四";
   rootNode.AppendChild(node);
   Console.WriteLine(xmlDoc.InnerXml);   xmlDoc.Save(fileName);//保存到文件

XmlReader与XmlWriter

  XmlReader操作XML比XmlDocument更快、内存消耗更少(可以写一个测试验证一下);但是它需要去手动判断元素的类型,操作起来比XmlDocument稍微蛋疼一些

    using (XmlWriter xmlWriter = XmlWriter.Create(fileName))
    {
        xmlWriter.WriteStartDocument();//开始写入xml文档
        xmlWriter.WriteStartElement("users");
        xmlWriter.WriteStartElement("user");
        xmlWriter.WriteAttributeString(");
        xmlWriter.WriteString("张三");
        xmlWriter.WriteEndElement();

        xmlWriter.WriteStartElement("user");
        xmlWriter.WriteAttributeString(");
        xmlWriter.WriteString("李四");
        xmlWriter.WriteEndDocument();//结束写入xml文档
    }

    using (XmlReader xmlReader = XmlReader.Create(fileName))
    {
        while (xmlReader.Read())
        {
            if (xmlReader.NodeType == XmlNodeType.Element)//元素的类型
            {
                Console.WriteLine(xmlReader.Name);//元素名称
                if (xmlReader.HasAttributes)
                {
                    Console.WriteLine(xmlReader.GetAttribute("Id"));//元素名称
                }
                Console.WriteLine(xmlReader.ReadOuterXml());//获取节点的所有子内容
            }
        }
    }

DataSet与XML数据

  通过XmlReader将数据读入到DataSet数据集中

   using (XmlReader xmlReader = XmlReader.Create(fileName, new XmlReaderSettings()))
   {
       DataSet ds = new DataSet();
       ds.ReadXml(xmlReader);
       DataTable dt = ds.Tables[];
       ; i < dt.Rows.Count - ; i++)
       {
           object[] items = dt.Rows[i].ItemArray;
           Console.WriteLine(string.Join(" ", items));
       }
   }

  将数据表保存到XML文件也是比较常用的

   DataSet ds = new DataSet();
   DataTable dt = new DataTable();
   dt.Columns.Add(new DataColumn("Id", Type.GetType("System.Int32")));
   dt.Columns.Add(new DataColumn("Grade", Type.GetType("System.Int32")));
   dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String")));

   DataRow dr = dt.NewRow();
   dr[;
   dr[;
   dr["Name"] = "孙七";
   dt.Rows.Add(dr);

   ds.Tables.Add(dt);
   ds.Tables[].TableName = "Student";//每张表为根节点下的第一个子节点
   ds.WriteXml(fileName);

Linq to XML

  通过linq操作XML上手快、操作方便

  //查询
  XDocument xdoc = XDocument.Load(fileName);
  var query = from item in xdoc.Descendants("Item")
              select new { Id = item.Attribute("Id").Value, Name = item.Value };
  foreach (var item in query)
  {
      Console.WriteLine(item.Id + " " + item.Name);
  }
 //添加
 XDocument xdoc = XDocument.Load(fileName);
 XElement xele = new XElement("Item","吴十?");//创建节点
 xele.SetAttributeValue();//设置节点特性值
 xdoc.Element("Root").Add(xele);
 xdoc.Save(fileName);
 //删除
 XDocument xdoc = XDocument.Load(fileName);
 XElement xele = xdoc.Descendants(")).FirstOrDefault();
 xele.Remove();
 xdoc.Save(fileName);
  //修改
  XDocument xdoc = XDocument.Load(fileName);
  XElement xele = xdoc.Descendants(")).FirstOrDefault();
  xele.Value = "流年";
  xdoc.Save(fileName);

XML序列化与反序列化

 //序列化
 , Grade = , Name = "王五" };
 XmlSerializer serializer = new XmlSerializer(typeof(Student));
 serializer.Serialize(Console.Out, student);
 //反序列化
 string input = "<?xml version=\"1.0\" encoding=\"gb2312\"?><student><Id> 1 </Id><Grade> 2 </Grade><Name> 李四 </Name></student>";
 using (StringReader sr = new StringReader(input))
 {
     XmlSerializer serializer = new XmlSerializer(typeof(Student));
     Student student = (Student)serializer.Deserialize(sr);
     Console.WriteLine(student.Name);
 }

扩展阅读

http://www.dotnetcurry.com/linq/564/linq-to-xml-tutorials-examples

http://www.tutorialspoint.com/linq/linq_xml.htm

https://msdn.microsoft.com/en-us/library/mt693062.aspx

http://broadcast.oreilly.com/2010/10/understanding-c-simple-linq-to.html

http://www.codeproject.com/Articles/24376/LINQ-to-XML

http://csharp.net-tutorials.com/xml/reading-xml-with-the-xmlreader-class/

https://msdn.microsoft.com/zh-cn/library/58a18dwa(v=vs.120).aspx

http://csharp.net-informations.com/xml/xml-de-serialization.htm

XML文档操作集锦(C#篇)的更多相关文章

  1. XML文档操作之JAXP下实现

    JAXP是java API for xml PRocessing的缩写. 其API可以在javax.xml.parsers 这个包中找到.这个包向用户提供了两个最重要的工厂类,SAXParserFac ...

  2. 关于XML文档操作类

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.X ...

  3. xml文档操作

    /** * */package com.gootrip.util; import java.io.ByteArrayOutputStream;import java.io.File;import ja ...

  4. C#XmlHelper帮助类操作Xml文档的通用方法汇总

    前言 该篇文章主要总结的是自己平时工作中使用频率比较高的Xml文档操作的一些常用方法和收集网上写的比较好的一些通用Xml文档操作的方法(主要包括Xml序列化和反序列化,Xml文件读取,Xml文档节点内 ...

  5. 用ORM的思想操作XML文档,一个对象就搞定不要太简单。滚蛋吧!XmlDocument、XmlNode、Xml***……

    大家有没有这样的感受,一涉及XML文档操作就得百度一遍.是不是非!常!烦!.各种类型,各种方法,更别提为了找到一个节点多费劲.本来想写个XML操作的工具方法,写了两行一想既然XML文档是有规律的,如果 ...

  6. XMLHelper类 源码(XML文档帮助类,静态方法,实现对XML文档的创建,及节点和属性的增、删、改、查)

    以下是代码: using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  7. 【XML】利用Dom4j读取XML文档以及写入XML文档

    Dom4j简介 dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的.dom4j是一个十分优秀的JavaXML API,具有性能优异.功能强大和极其易使用的特点,它的性能 ...

  8. 【JAVA与DOM4J实现对XML文档的CRUD操作】

    一.简介 1.网上下载DOM4J 1.6.1压缩包,解压开之后,发现几个目录和一个jar文件,jar文件是必须的文件其它目录: docs目录:帮助文档的目录,单击index.html: Quick s ...

  9. C#操作XML文档---基础

    增查改删代码如下 public void CreateXML() { XmlDocument xml = new XmlDocument(); xml.AppendChild(xml.CreateXm ...

随机推荐

  1. WPF - 属性系统 (1 of 4)

    本来我希望这一系列文章能够深入讲解WPF属性系统的实现以及XAML编译器是如何使用这些依赖项属性的,并在最后分析WPF属性系统的实际实现代码.但是在编写的过程中发现对WPF属性系统代码的讲解要求之前的 ...

  2. 剑指Offer面试题:3.替换空格

    一.题目:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成"%20".例如输入“We are happy.”,则输出“We%20are%20happy.”. 在网络编程中 ...

  3. 一个新人如何学习在大型系统中添加新功能和Debug

    文章背景: 今年七月份正式入职,公司主营ERP软件,楼主所在的组主要负责二次开发,使用的语言是Java. 什么叫二次开发呢?ERP软件的客户都是企业.而这些企业之间的情况都有所不同,一套标准版本的企业 ...

  4. cache4j轻量级java内存缓存框架,实现FIFO、LRU、TwoQueues缓存模型

    简介 cache4j是一款轻量级java内存缓存框架,实现FIFO.LRU.TwoQueues缓存模型,使用非常方便. cache4j为java开发者提供一种更加轻便的内存缓存方案,杀鸡焉用EhCac ...

  5. 《3D Math Primer for Graphics and Game Development》读书笔记1

    <3D Math Primer for Graphics and Game Development>读书笔记1 本文是<3D Math Primer for Graphics and ...

  6. RabbitMQ Exchange & Queue Design Trade-off

    In previous post, I mentioned the discussion on StackOverflow regarding designing exchanges. Usually ...

  7. Linux服务器配置之加载硬盘

    Linux服务器配置之加载硬盘 1.修改密码 passwd 2.测试密码是否成功 3.查看硬盘信息 fdisk –l 4.格式化分区 fdisk /dev/vdb 5.查看分区 6.快速格式化/dev ...

  8. 《Entity Framework 6 Recipes》中文翻译系列 (20) -----第四章 ASP.NET MVC中使用实体框架之在MVC中构建一个CRUD示例

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第四章  ASP.NET MVC中使用实体框架 ASP.NET是一个免费的Web框架 ...

  9. 《Entity Framework 6 Recipes》中文翻译系列 (22) -----第五章 加载实体和导航属性之延迟加载

    翻译的初衷以及为什么选择<Entity Framework 6 Recipes>来学习,请看本系列开篇 第五章 加载实体和导航属性 实体框架提供了非常棒的建模环境,它允许开发人员可视化地使 ...

  10. 单节点部署Hadoop教程

    搭建HDFS 增加主机名 我这里仅仅增加了master主机名 [root@10 /xinghl/hadoop/bin]$ cat /etc/hosts 127.0.0.1 localhost 10.0 ...