C#使用XML文件的详解及示例

XML是 Extensible Markup Language 的简称,用于存储和传输数据的可扩展标记语言。它被应用在数据交换、数据存储、Web服务、网络协议等场景。

XML 具有可扩展性、结构化、标准化、简单易读等几个特点。

基本结构

XML 基本结构包括文档声明、根元素、子元素、属性、注释、处理指令等部分。

<?xml version="1.0" encoding="UTF-8"?><根元素>  <子元素 属性="属性值">内容</子元素>  <!-- 注释内容 -->  <?处理指令 ?></根元素>
文档声明

文档声明主要用于描述XML文档的版本编码格式,每个文档必须包含一个声明,并在文档开头。如下声明:版本1.0 编码格式为UTF-8。

<?xml version="1.0" encoding="UTF-8"?>
根元素

根元素包围文档中的所有数据,是其它元素的根,每个文档必须有一个根元素。如下示例:有一个configure根元素,其下有其它内容。​​​​​​​

<configure>  <Description>Fountain WinForm App</Description>  <Files>    <File Version="1.2.11.0" Name="log4net.dll" DateTime="2023-4-26" />  </Files></configure>
子元素

子元素是文档的基本单元,它包含属性、内容等元素。如下示例:​​​​​​​

<name>Apple</name>
<File Version="1.2.11.0" Name="log4net.dll" DateTime="2023-4-26" />
属性

元素可以有属性,用于元素的额外信息。它在开始标签中定义,以名称/键值对的形式出现。如下示例:File 元素存在Version、Name、DateTime属性。

<File Version="1.2.11.0" Name="log4net.dll" DateTime="2023-4-26" />
注释

注释为文档中添加注释或说明,以<!--开始,以-->结束。如下示例:​​​​​​​

<configure>  <Description>Fountain WinForm App</Description>  <Files>    <!-- 程序的所文件名称、版本、更新日期 -->    <File Version="1.2.11.0" Name="log4net.dll" DateTime="2023-4-26" />  </Files></configure>
处理指令

处理指令提供了关于XML处理器如何处理文档的指令。如下示例:标识 文档的样式表。

 <?xml-stylesheet type="text/xsl" href="sample.xsl"?>
命名空间

用于定义文档中元素和属性的范围和作用域的机制。

文档操作

通过System.XML命名空间中的类可以完成常用的操作。下表为操作XML文档相关的类。

描述
XmlDocument创建、修改及保存XML文档。
XmlNode表示 XML 文档中的单个节点
XmlElement访问元素的名称、属性和子元素。
XmlTextWriter提供快速、非缓存的写入器。
XPathDocument提供只读形式读取XML文档。
XPathNavigator提供浏览、提取XML节点 数据
XmlAttribute访问XML属性的名称和值
XmlText访问文本内容
创建文档

通过 XmlDocument 的 CreateXmlDeclaration 对 XML 文档进行声明,再通过 CreateElement 创建 XML 元素,最后保存 XML 文件。下面通过代码进一步了解 XML 文档的创建。​​​​​​​

using System;using System.IO;using System.Windows.Forms;using System.Xml;
namespace Fountain.WinForm.XMLDemo{    public partial class XMLDemoForm : Form    {        public XMLDemoForm()        {            InitializeComponent();        }        /// <summary>        /// 创建文档        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void ButtonCreate_Click(object sender, EventArgs e)        {            try            {                XmlDocument xmlDocument = new XmlDocument();                // XML声明                XmlDeclaration xmlDeclaration = xmlDocument.CreateXmlDeclaration("1.0", "utf-8", "yes");                xmlDocument.AppendChild(xmlDeclaration);                //创建根元素                XmlElement rootNode = xmlDocument.CreateElement("configure");                xmlDocument.AppendChild(rootNode);                // 创建 Description 子元素                XmlElement descSubElement = xmlDocument.CreateElement("Description");                //元素内容                descSubElement.InnerText = "Fountain WinForm App";                rootNode.AppendChild(descSubElement);
                // 创建 Updater 子元素                XmlElement updaterSubElement = xmlDocument.CreateElement("Updater");                rootNode.AppendChild(updaterSubElement);
                // 创建 url 子元素                XmlElement urlSubElement = xmlDocument.CreateElement("url");                //中间文本                urlSubElement.InnerText = "http://127.0.0.1/update";                // 添加到父结点                updaterSubElement.AppendChild(urlSubElement);
                XmlElement versionSubElement = xmlDocument.CreateElement("Version");                //中间文本                versionSubElement.InnerText = "3.8.0.24043";                // 添加到父结点                updaterSubElement.AppendChild(versionSubElement);
                // 创建 Files 子元素                XmlElement filesSubElement = xmlDocument.CreateElement("Files");                rootNode.AppendChild(filesSubElement);                // 创建 File 子元素                XmlElement fileSubElement = xmlDocument.CreateElement("File");                // 属性                fileSubElement.SetAttribute("Version", "1.2.11.0");                fileSubElement.SetAttribute("Name", "log4net.dll");                fileSubElement.SetAttribute("DateTime", DateTime.Now.ToString("yyyy-MM-dd"));                filesSubElement.AppendChild(fileSubElement);                // 保存文档                xmlDocument.Save(string.Format("{0}{1}{2}", Application.StartupPath,Path.DirectorySeparatorChar, "Version.xml"));            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }        }    }}

运行结果:​​​​​​​

<?xml version="1.0" encoding="utf-8" standalone="yes"?><configure>  <Description>Fountain WinForm App</Description>  <Updater>    <url>http://127.0.0.1/update</url>    <Version>3.8.0.24043</Version>  </Updater>  <Files>    <File Version="1.2.11.0" Name="log4net.dll" DateTime="2024-04-13" />  </Files></configure>
读取文档

通过 XmlDocument 的 Load 对 XML 文档进行加载XML文件,然后通过 SelectSingleNode 得到指定的节点元素,再通过 GetAttribute 得到具体的属性值。下面通过代码进一步了解 XML 文档的读取。

using System;using System.IO;using System.Text;using System.Windows.Forms;using System.Xml;
namespace Fountain.WinForm.XMLDemo{    public partial class XMLDemoForm : Form    {        public XMLDemoForm()        {            InitializeComponent();        }        /// <summary>        /// 读取文档        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void ButtonRead_Click(object sender, EventArgs e)        {            try            {                XmlDocument xmlDocument = new XmlDocument();                xmlDocument.Load(string.Format("{0}{1}{2}", Application.StartupPath, Path.DirectorySeparatorChar, "Version.xml"));                // 获取 Files                XmlNode XmlNode = xmlDocument.SelectSingleNode("configure");                // 得到根节点的所有子节点                XmlNodeList xmlNodeList = XmlNode.ChildNodes;                StringBuilder stringBuilder = new StringBuilder();                // 循环读取                foreach (XmlNode xmlNode in xmlNodeList)                {                    // 判断节点是否有子节点                    if (xmlNode.ChildNodes.Count>0)                    {                        foreach (XmlNode subXmlNode in xmlNode.ChildNodes)                        {                            stringBuilder.AppendLine(string.Format("{0}:{1}", subXmlNode.Name, subXmlNode.InnerText));                            // 读取元素属性                            if (subXmlNode.Attributes!=null && subXmlNode.Attributes.Count>0)                            {                                for (int i = 0; i < subXmlNode.Attributes.Count;i++)                                {                                    stringBuilder.AppendLine(string.Format("{0}:{1} 属性{2}={3}",                                        subXmlNode.Name,                                         subXmlNode.InnerText,                                        subXmlNode.Attributes[i].Name,                                        subXmlNode.Attributes[i].Value));                                }                            }                        }                        continue;                    }                    stringBuilder.AppendLine(string.Format("{0}:{1}", xmlNode.Name,xmlNode.InnerText));                }                // MessageBox.Show(stringBuilder.ToString());                Console.WriteLine(stringBuilder.ToString());            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }        }    }}

运行结果:

#text:Fountain WinForm Appurl:http://127.0.0.1/updateVersion:3.8.0.24043File:File: 属性Version=1.2.11.0File: 属性Name=log4net.dllFile: 属性DateTime=2024-04-13
修改文档

通过 XmlDocument 的 Load 对 XML 文档进行加载XML文件,然后读取到元素节点,对元素节点进行删除、变属性值、元素文本等,最后保存 XML 文件。下面通过代码进一步了解 XML 文档的修改。

using System;using System.IO;using System.Text;using System.Windows.Forms;using System.Xml;
namespace Fountain.WinForm.XMLDemo{    public partial class XMLDemoForm : Form    {        public XMLDemoForm()        {            InitializeComponent();        }        /// <summary>        ///  修改文档        /// </summary>        /// <param name="sender"></param>        /// <param name="e"></param>        private void ButtonModify_Click(object sender, EventArgs e)        {            try            {                XmlDocument xmlDocument = new XmlDocument();                xmlDocument.Load(string.Format("{0}{1}{2}", Application.StartupPath, Path.DirectorySeparatorChar, "Version.xml"));                // 获取根元素                XmlNode rootNode = xmlDocument.DocumentElement;                // 获取主信息                 XmlNodeList xmlNodeList = rootNode.SelectNodes("Updater");                foreach (XmlNode xmlNodeUpdate in xmlNodeList)                {                    XmlNodeList xmlNodeMainInfo = xmlNodeUpdate.ChildNodes;                    foreach (XmlNode xmlMainInfo in xmlNodeMainInfo)                    {                        if ("url".Equals(xmlMainInfo.Name,StringComparison.OrdinalIgnoreCase))                        {                            // 删除 url 元素节点                            xmlNodeUpdate.RemoveChild(xmlMainInfo);                            break;                        }                    }                }                // 循环读取                foreach (XmlNode xmlNode in xmlNodeList)                {                    if (xmlNode.ChildNodes.Count > 0)                    {                        foreach (XmlNode subXmlNode in xmlNode.ChildNodes)                        {                            if (subXmlNode.Attributes != null && subXmlNode.Attributes.Count > 0)                            {                                for (int i = 0; i < subXmlNode.Attributes.Count; i++)                                {                                    if ("DateTime".Equals(subXmlNode.Attributes[i].Name,StringComparison.OrdinalIgnoreCase))                                    {                                        // 修改元素节点属性                                        subXmlNode.Attributes[i].Value = DateTime.Now.ToString("yyyy-MM-dd");                                    }                                }                            }                        }                        continue;                    }                }                xmlDocument.Save(string.Format("{0}{1}{2}", Application.StartupPath, Path.DirectorySeparatorChar, "Version.xml"));            }            catch (Exception ex)            {                MessageBox.Show(ex.Message);            }        }    }}

运行结果:​​​​​​​

<?xml version="1.0" encoding="utf-8" standalone="yes"?><configure>  <Description>Fountain WinForm App</Description>  <Updater>    <Version>3.8.0.24043</Version>  </Updater>  <Files>    <File Version="1.2.11.0" Name="log4net.dll" DateTime="2024-04-13" />  </Files></configure>

小结

以上 XML 文档相关内容及在C#中如何实现对文件创建、修改、读取的操作。希望能帮助大家对XML的应用有一定的参考作用。 对 XML 的创建、修改、读取也有其它方式。后续对其介绍。

  • 21
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
接口在C#中有广泛的使用场景,以下是一些常见的示例: 1. 定义插件系统:接口可以用于定义插件的规范,插件开发者只需实现接口中定义的方法,即可实现自己的功能,并与主程序进行交互。 2. 多态性和抽象:通过接口,可以实现多态性和抽象,使得代码更加灵活和可扩展。例如,定义一个形状的接口,然后让各种不同的形状类实现该接口,可以方便地对这些形状进行统一的处理。 3. 数据库操作:在数据库操作中,接口可以用于定义数据访问层的规范,不同的数据库操作类可以实现同一个接口,从而实现对不同数据库的统一操作。 以下是一个使用场景示例: ``` interface ILogger { void Log(string message); } class ConsoleLogger : ILogger { public void Log(string message) { Console.WriteLine(message); } } class FileLogger : ILogger { public void Log(string message) { // 将日志信息写入文件 } } class DatabaseService { private ILogger logger; public DatabaseService(ILogger logger) { this.logger = logger; } public void InsertData() { // 插入数据的逻辑 logger.Log("数据插入成功"); } } ``` 在上面的示例中,定义了一个 ILogger 接口,以及两个实现类 ConsoleLogger 和 FileLogger。DatabaseService 类依赖于 ILogger 接口,通过构造函数注入具体的日志记录器实例。在 InsertData 方法中,插入数据成功后会调用 ILogger 接口的 Log 方法,根据具体的实现类来记录日志。 通过接口的使用,可以方便地替换不同的日志记录器,实现了解耦和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值