欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C# Xml文档操作快速上手

程序员文章站 2022-05-23 10:40:53
...
   现在各大数据库公司都在开发Xml数据库(非关系型),而C#将对Xml的操作集成到了语言中,使得程序操作Xml 十分简便,现在让你快速上手Xml操作。
首先我们要知道Xml是树形结构,所以节点的概念十分重要。我们先要知道这些方法和类,具体的应用见下面的代码。

XmlDocument Xml文档类
     重要方法有:
         Load(xmlPath);   //载入Xml文档,xmlPath为路径
         Save(xmlPath);   //保存Xml文档
     重要属性
          DocumentElement  //根节点

XmlElement 节点类
     重要方法:
         PrependChild(XmlElement childNode); //将childNode 添加到当前节点的第一个子节点
         AppendChild(XmlElement childNode); //将childNode 添加到当前节点的最后一个子节点
         SetAttribute(string "属性名",string "属性值");//设置当前节点属性
         SelectNodes(string 条件);  //通过条件得到子节点,若有多个,返回第一个具体见代码
         SelectSingleNode();      //意义同上,返回所有节点  xmlNodeList类
        
     重要属性:
          InnerText          //节点中的内容
          ChildNodes         //所有子节点  xmlNodeList类
          ParentNode        //父节点

先往一个Xml文档写入,再读取其中的内容
   
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace XmlDeal
{
    //操作Xml文档
    class XmlDeal
    {
        private XmlDocument doc;
        private string xmlPath = "C:\\Users\\Administrator\\Desktop\\test.xml";
        public XmlDeal() {
            doc = new XmlDocument();
            //加载 Xml(在这之前,你得确保xml中有一个根节点,否则会报错),还可以用流来加载,这里就不演示了
            doc.Load(xmlPath);
        }
        public void xmlWrite() {
            //移除根节点下的所有节点

            doc.DocumentElement.RemoveAll();
            
            //注意如果按下面的写法写的话,会有一些节点没有被删除,以为根节点的子节点的count在变化,读者好好体会吧
            //foreach (XmlElement rootNode in doc.DocumentElement.ChildNodes) {
            //    rootNode.ParentNode.RemoveChild(rootNode);
            //}

            XmlElement node = doc.CreateElement("小说");
            //设置属性
            node.SetAttribute("序号","1");

            //新建子节点
            XmlElement childNode1 = doc.CreateElement("书名");
            node.PrependChild(childNode1);
            childNode1.InnerText = "哈利 波特";
            //插入到父节点的末尾
            node.AppendChild(childNode1);

            XmlElement childNode2 = doc.CreateElement("作者");
            node.PrependChild(childNode2);
            childNode2.InnerText = "杰克 罗琳";
            node.AppendChild(childNode2);

            XmlElement node2 = doc.CreateElement("小说");
            node2.SetAttribute("序号", "2");

            //新建子节点
            XmlElement childNode21 = doc.CreateElement("书名");
            node.PrependChild(childNode21);
            childNode21.InnerText = "致青春";
            //插入到父节点的末尾
            node2.AppendChild(childNode21);

            XmlElement childNode22 = doc.CreateElement("作者");
            node.PrependChild(childNode22);
            childNode22.InnerText = "辛夷坞";
            node2.AppendChild(childNode22);


            //获取文档的根节点,并将 node 添加到根节点的子节点的开头,注意append 不会覆盖以前的数据
            doc.DocumentElement.AppendChild(node);
            doc.DocumentElement.AppendChild(node2);
            doc.Save(xmlPath);
        }

        //查找读入xml中的信息
        public void xmlRead() {
            //得到父节点
            XmlElement root = doc.DocumentElement;

            //得到文本中内容的方法一,通过不断获得子节点获得其中的内容
            XmlNodeList nodeList = root.ChildNodes;
            foreach(XmlElement node in nodeList){
                foreach(XmlElement child in node.ChildNodes){
                    Console.WriteLine(child.InnerText);
                }
            }

            Console.WriteLine();

            //得到文本中的内容的方法二,通过表达式,读者可以比较下区别
            XmlNode node1 = doc.SelectSingleNode("/Book/小说/书名");
            Console.WriteLine(node1.InnerText);

            //[]中的是条件格式为  节点[@属性名='属性值']
            XmlNode node2 = doc.SelectSingleNode("/Book/小说[@序号= '2']/书名");
            Console.WriteLine(node2.InnerText);

            //通过节点名获得属性值
              Console.WriteLine(node2.Attributes["序号"].Value);
            
        }
        public static void Main(string[] args) {
            XmlDeal xmlDeal = new XmlDeal();
            xmlDeal.xmlWrite();
            xmlDeal.xmlRead();
            while (true) { }
        }
    }
    

}

写入的Xml文件内容如下:
<Book>
  <小说 序号="1">
    <书名>哈利 波特</书名>
    <作者>杰克 罗琳</作者>
  </小说>
  <小说 序号="2">
    <书名>致青春</书名>
    <作者>辛夷坞</作者>
  </小说>
</Book>


输出如下:


哈利 波特
杰克 罗琳
致青春
辛夷坞

哈利 波特
致青春
2

若文章有知识性错误,欢迎指正!