@TOC

C#实用教程-操作xml文件

引言:什么是xml文件

可扩展标记语言,标准通用标记语言的子集,简称XML。是一种用于标记电子文件使其具有结构性的标记语言。
在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等。它可以用来标记数据、定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言。 它非常适合万维网传输,提供统一的方法来描述和交换独立于应用程序或供应商的结构化数据。是Internet环境中跨平台的、依赖于内容的技术,也是当今处理分布式结构信息的有效工具。早在1998年,W3C就发布了XML1.0规范,使用它来简化Internet的文档信息传输。

中文名 可扩展标记语言
外文名 Extensible Markup Language
类 型 标记语言
外语缩写 XML(也做文件扩展名)
中文缩写 可扩标言
其他称呼 可扩展置标语言、可扩展标识语言
是否区分大小写

Xml的特征

XML具有以下特点:

  • (1) XML可以从HTML中分离数据。即能够在HTML文件之外将数据存储在XML文档中,这样可以使开发者集中精力使用HTML做好数据的显示和布局,并确保数据改动时不会导致HTML文件也需要改动,从而方便维护页面。XML也能够将数据以“数据岛”的形式存储在HTML页面中,开发者依然可以把精力集中到使用HTML格式化和显示数据上。
  • (2) XML可用于交换数据。基于XML可以在不兼容的系统之间交换数据,计算机系统和数据库系统所存储的数据有多种形式,对于开发者来说,最耗时间的工作就是在遍布网络的系统之间交换数据。把数据转换为XML格式存储将大大减少交换数据时的复杂性,还可以使这些数据能被不同的程序读取。
  • (3) XML可应用于B2B中。例如在网络中交换金融信息, 目前XML正成为遍布网络的商业系统之间交换信息所使用的主要语言,许多与B2B有关的完全基于XML的应用程序正在开发中。
  • (4)利用XML可以共享数据。XML数据以纯文本格式存储,这使得XML更易读、更便于记录、更便于调试,使不同系统、不同程序之间的数据共享变得更加简单。
  • (5) XML可以充分利用数据。XML是与软件、硬件和应用程序无关的,数据可以被更多的用户、设备所利用,而不仅仅限于基于HTML标准的浏览器。其他客户端和应用程序可以把XML文档作为数据源来处理,就像操作数据库一样,XML的数据可以被各种各样的“阅读器”处理。
  • (6) XML可以用于创建新的语言。比如,WAP和WML语言都是由XML发展来的。WML(Wireless Markup Language,无线标记语言)是用于标识运行于手持设备上(比如手机)的Internet程序的工具,它就采用了XML的标准。

总之,XML使用一个简单而又灵活的标准格式,为基于Web的应用提供了一个描述数据和交换数据的有效手段。但是,XML并非是用来取代HTML的。HTML着重如何描述将文件显示在浏览器中,而XML与SGML相近,它着重描述如何将数据以结构化方式表示。

Xml的格式

XML文件格式是纯文本格式,在许多方面类似于HTML,XML由XML元素组成,每个XML元素包括一个开始标记(),一个结束标记()以及两个标记之间的内容,例如,可以将XML元素标记为价格、订单编号或名称。标记是对文档存储格式和逻辑结构的描述。在形式上,标记中可能包括注释、引用、字符数据段、起始标记、结束标记、空元素、文档类型声明( DTD)和序言。
具体规则如下:

  1. 必须有声明语句。
    XML声明是XML文档的第一句,其格式如下:
    <?xml version="1.0" encoding="utf-8"?>
  2. 注意大小写
    在XML文档中,大小写是有区别的。“A”和“a”是不同的标记。注意在写元素时,前后标记的大小写要保持一致。最好养成一种习惯,或者全部大写,或者全部小写,或者大写第一个字母,这样可以减少因为大小写不匹配而产生的文档错误。
  3. XML文档有且只有一个根元素
    良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。
  4. 属性值使用引号
    在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。
  5. 所有的标记必须有相应的结束标记
    在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。
  6. 所有的空标记也必须被关闭
    空标记是指标记对之间没有内容的标记,比如“”等标记。在XML中,规定所有的标记必须有结束标记。
    例如:
    <?xml version="1.0" encoding="utf-8" ?>
    <i18n>
    <!-- 默认的语言,以主程序的优先 -->
    <locale id="2052" />
    <!-- 语言文字列表 -->
    <StringBundle>
        <configfile name="SSOStringBundle.xml"/>
    </StringBundle>
    <!-- 地区信息,目前只需要一个, SSOPlatform不需要地区信息 -->
    <!--Location2>
        <configfile name="LocList.xml"/>
    </Location2-->
    </i18n>

    与HTML的区别

    • (1)可扩展性方面:HTML不允许用户自行定义他们自己的标识或属性,而在XML中,用户能够根据需要自行定义新的标识及属性名,以便更好地从语义上修饰数据。
    • (2)结构性方面:HTML不支持深层的结构描述,XML的文件结构嵌套可以复杂到任意程度,能表示面向对象的等级层次。
    • (3)可校验性方面:HTML没有提供规范文件以支持应用软件对HTML文件进行结构校验,而XML文件可以包括一个语法描述,使应用程序可以对此文件进行结构校验。

对Xml进行操作

读取xml文件:

//读取xml文件
//将XML文件加载进来
System.Xml.Linq.XDocument document = System.Xml.Linq.XDocument.Load("config.xml");
//获取到XML的根元素进行操作
System.Xml.Linq.XElement root = document.Root;
//获取usually子节点
System.Xml.Linq.XElement usually = root.Element("usually");
//获取usually子节点中的元素值
string temp = usually.Value;//此时temp = "am";

当前xml文件内容如下:

<!--当前xml文件内容如下-->
<?xml version="1.0" encoding="utf-8"?> <!--固有表头-->
<System.Config>              <!--根节点-->
  <usually>am</usually>         <!--usually子节点-->
</System.Config>             <!--根节点尾部标识-->

创建xml文件,并添加元素

//创建xml文件,并进行修改操作
//声明
XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, "", "");
xmlnode.InnerText += " encoding=\"utf-8\"";
xmldoc.AppendChild(xmlnode);

//CreateElement的参数:
//    prefix:
//     新元素的前缀(如果有的话)。 String.Empty 与 null 等效。
//
//   localName:
//     新元素的本地名称。
//
//   namespaceURI:
//     新元素的命名空间 URI(如果有的话)。 String.Empty 与 null 等效。
//添加根节点
XmlElement xmlelementroot = xmldoc.CreateElement("", "System.Config", "");
//根节点包含节点文本时会造成XML文档结构的混乱
//xmltext = xmldoc.CreateTextNode("配置信息");
//xmlelementroot.AppendChild(xmltext);
xmldoc.AppendChild(xmlelementroot);

//添加一个元素
XmlElement xmlelement0 = xmldoc.CreateElement("", "usually1", "");
xmltext = xmldoc.CreateTextNode("am");
xmlelement0.AppendChild(xmltext);
xmldoc.ChildNodes.Item(1).AppendChild(xmlelement0);
//添加另一个元素
XmlElement xmlelement1 = xmldoc.CreateElement("", "usually2", "");
xmltext = xmldoc.CreateTextNode("pm");
xmlelement1.AppendChild(xmltext);
mldoc.ChildNodes.Item(1).AppendChild(xmlelement1);

//保存
xmldoc.Save("config.xml");

创建的xml文件内容如下:

<?xml version="1.0" encoding="utf-8"?>
<System.Config>
    <usually1>am</usually1>
  <usually2>pm</usually2>
</System.Config>

对xml文件内容进行增删改查等操作:

//节点.net没提供修改的方法本文也不做处理
//修改属性与新增实质是同一个方法
XDocument xDoc = XDocument.Load("config.xml");
XElement element = (XElement)xDoc.Element("usually1").Element("am");
element.Remove();
xDoc.Save("config.xml");

//对节点进行查找并输出
XmlDocument doc = new XmlDocument();
doc.Load("orders.xml");
XmlNodeList nodes = doc.SelectNodes("/System.Config/usually2");
foreach (XmlNode node in nodes) {
    if(node.InnerText =="pm")
        Console.WriteLine(node.InnerText);
}

更新对Xml文件进行更新修改(添加了对xml读写修改的方法)

2021年09月09日-13:31补充

/// <summary>
/// 操作配置文件config.xml
/// </summary>
public class Config
{
    private static readonly string path = "config";
    private static readonly string filename = "config/config.xml";

    /// <summary>
    /// 获取模式设置(日间、夜间或自动)
    /// </summary>
    /// <returns>am、pm or anto</returns>
    public static string GetModel()
    {
        if (File.Exists(filename) == true)
        {
            try
            {
                XDocument document = XDocument.Load(filename);
                XElement root = document.Root;
                XElement model = root.Element("model");
                return model.Value;
            }
            catch (Exception)
            {
                ModityConfig("model", "auto");
                return "auto";
            }
        }
        else { ModityConfig("model", "auto"); return "auto"; }
    }
    /// <summary>
    /// 是否开机自启
    /// </summary>
    /// <returns>true or false</returns>
    public static Boolean GetStart()
    {
        if (File.Exists(filename) == true)
        {
            try
            {
                XDocument document = XDocument.Load(filename);
                XElement root = document.Root;
                XElement startup = root.Element("startup");
                if (startup.Value == "on") { return true; }
                else { return false; }
            }
            catch (Exception)
            {
                ModityConfig("startup", "off");
                return false;
            }
        }
        else { ModityConfig("startup", "off"); return false; }
    }
    /// <summary>
    /// 是否自动登录
    /// </summary>
    /// <returns>true or false</returns>
    public static Boolean GetAutologin()
    {
        if (File.Exists(filename) == true)
        {
            try
            {
                System.Xml.Linq.XDocument document = System.Xml.Linq.XDocument.Load(filename);
                System.Xml.Linq.XElement root = document.Root;
                System.Xml.Linq.XElement autologin = root.Element("autologin");
                if (autologin.Value == "on") { return true; }
                else { return false; }
            }
            catch (Exception)
            {
                ModityConfig("autologin", "off");
                return false;
            }
        }
        else { ModityConfig("autologin", "off"); return false; }
    }
    /// <summary>
    /// 是否自动更新
    /// </summary>
    /// <returns>true or false</returns>
    public static Boolean GetUpdate()
    {
        if (FindConfig() == true)
        {
            try
            {
                System.Xml.Linq.XDocument document = System.Xml.Linq.XDocument.Load(filename);
                System.Xml.Linq.XElement root = document.Root;
                System.Xml.Linq.XElement update = root.Element("update");
                if (update.Value == "auto") { return true; }
                else { return false; }
            }
            catch (Exception)
            {
                ModityConfig("update", "auto");
                return true;
            }
        }
        else { ModityConfig("update", "auto"); return false; }
    }
    /// <summary>
    /// 查找配置文件是否存在
    /// </summary>
    /// <returns>true or false</returns>
    public static Boolean FindConfig()
    {
        //如果目录不存在
        if (System.IO.Directory.Exists(path) == false) { System.IO.Directory.CreateDirectory(path); }
        //如果配置文件不存在
        if (System.IO.File.Exists(filename) == false)
        {
            FileStream fs = new FileStream(filename, FileMode.Create);
            fs.Close();
            XmlDocument xmldoc = new XmlDocument();
            XmlText xmltext;

            //声明
            XmlNode xmlnode = xmldoc.CreateNode(XmlNodeType.XmlDeclaration, "", "");
            xmlnode.InnerText += " encoding=\"utf-8\"";
            xmldoc.AppendChild(xmlnode);

            //添加根节点
            XmlElement xmlelementroot = xmldoc.CreateElement("", "System.Config", "");
            xmldoc.AppendChild(xmlelementroot);

            //添加一个元素
            XmlElement xmlelement0 = xmldoc.CreateElement("", "model", "");
            xmltext = xmldoc.CreateTextNode("am");
            xmlelement0.AppendChild(xmltext);
            xmldoc.ChildNodes.Item(1).AppendChild(xmlelement0);

            //添加另一个元素
            XmlElement xmlelement1 = xmldoc.CreateElement("", "startup", "");
            xmltext = xmldoc.CreateTextNode("on");
            xmlelement1.AppendChild(xmltext);
            xmldoc.ChildNodes.Item(1).AppendChild(xmlelement1);

            //添加另一个元素
            XmlElement xmlelement2 = xmldoc.CreateElement("", "autologin", "");
            xmltext = xmldoc.CreateTextNode("off");
            xmlelement2.AppendChild(xmltext);
            xmldoc.ChildNodes.Item(1).AppendChild(xmlelement2);

            //添加另一个元素
            XmlElement xmlelement3 = xmldoc.CreateElement("", "update", "");
            xmltext = xmldoc.CreateTextNode("auto");
            xmlelement3.AppendChild(xmltext);
            xmldoc.ChildNodes.Item(1).AppendChild(xmlelement3);

            //保存
            xmldoc.Save(filename);

            return true;
        }
        else { return true; }
    }
    /// <summary>
    /// 修改配置信息
    /// </summary>
    /// <param name="name">结点名称</param>
    /// <param name="value">结点值</param>
    public static void ModityConfig(string name, string value)
    {
        //将XML文件加载进来
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(filename);
        XmlNode root = xmlDoc.SelectSingleNode("System.Config");
        XmlElement xe = xmlDoc.CreateElement(name);
        xe.InnerText = value;
        root.AppendChild(xe);
        xmlDoc.Save(filename);
    }
    /// <summary>
    /// 更新配置信息
    /// </summary>
    /// <param name="name">结点名称</param>
    /// <param name="value">更新值</param>
    public static void UpdateConfig(string name, string value)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load(filename);
        XmlNodeList nodeList = xmlDoc.SelectSingleNode("System.Config").ChildNodes;
        foreach (XmlNode xn in nodeList)//遍历所有子节点   
        {
            XmlElement xe = (XmlElement)xn;//转换类型   
            if (xe.Name == name)//如果找到
            {
                xe.InnerText = value;
            }
        }
        xmlDoc.Save(filename);
    }
}

写在最后

以上就是对xml的基本介绍和基本操作了,暂时先写这么多,后面也会进行完善。
你知道的越多,你不知道的越多,人才们的 【三连】 就是我创作的最大动力,我们下期见!
注:如果本篇博客有任何错误和建议,欢迎人才们留言,你快说句话啊!

参考:

  1. 李晓军主编.城市地下空间信息化技术指南:同济大学出版社,2016.04:第3页
  2. 青岛英谷教育科技股份有限公司编著.Web编程基础:西安电子科技大学出版社,2016.01:第189页
  3. 袁满,吴晓宇,黄刚,张岩,杜睿山编著.移动计算(修订版):哈尔滨工业大学出版社,2015.08:第227页
  4. 李海生著.知识管理技术与应用:北京邮电大学出版社,2012.04:第27页

原文链接:https://blog.xuanzhe.club/?id=55