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

简介: 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 App
url:http://127.0.0.1/update
Version:3.8.0.24043
File:
File: 属性Version=1.2.11.0
File: 属性Name=log4net.dll
File: 属性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#中如何实现对文件创建、修改、读取的操作。

目录
相关文章
|
2月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
16天前
|
XML JSON 数据处理
C# 中的 XML 与 JSON 数据处理
在现代软件开发中,数据交换和存储需求日益增长,XML 和 JSON 成为最常用的数据格式。本文从 C# 角度出发,详细介绍如何处理这两种格式,并提供示例代码。对于 XML,我们介绍了读取、创建和写入 XML 文件的方法;对于 JSON,则展示了如何使用 Newtonsoft.Json 库进行数据解析和序列化。此外,文章还总结了常见问题及其解决方案,帮助开发者更好地应对实际项目中的挑战。
159 61
C# 中的 XML 与 JSON 数据处理
|
1天前
|
XML JSON 前端开发
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
C#使用HttpClient四种请求数据格式:json、表单数据、文件上传、xml格式
16 0
|
1天前
|
API C#
异步轮询 Web API 的实现与 C# 示例
异步轮询 Web API 的实现与 C# 示例
7 0
|
2天前
|
XML 存储 Web App开发
|
1月前
|
SQL XML Java
mybatis :sqlmapconfig.xml配置 ++++Mapper XML 文件(sql/insert/delete/update/select)(增删改查)用法
当然,这些仅是MyBatis功能的初步介绍。MyBatis还提供了高级特性,如动态SQL、类型处理器、插件等,可以进一步提供对数据库交互的强大支持和灵活性。希望上述内容对您理解MyBatis的基本操作有所帮助。在实际使用中,您可能还需要根据具体的业务要求调整和优化SQL语句和配置。
34 1
|
2月前
|
数据安全/隐私保护 C# UED
利用 Xamarin 开展企业级移动应用开发:从用户登录到客户管理,全面演示C#与Xamarin.Forms构建跨平台CRM应用的实战技巧与代码示例
【8月更文挑战第31天】利用 Xamarin 进行企业级移动应用开发能显著提升效率并确保高质量和高性能。Xamarin 的跨平台特性使得开发者可以通过单一的 C# 代码库构建 iOS、Android 和 Windows 应用,帮助企业快速推出产品并保持一致的用户体验。本文通过一个简单的 CRM 示例应用演示 Xamarin 的使用方法,并提供了具体的代码示例。该应用包括用户登录、客户列表显示和添加新客户等功能。此外,还介绍了如何增强应用的安全性、数据持久化、性能优化及可扩展性,从而构建出功能全面且体验良好的移动应用。
36 0
|
2月前
|
前端开发 开发者 Apache
揭秘Apache Wicket项目结构:如何打造Web应用的钢铁长城,告别混乱代码!
【8月更文挑战第31天】Apache Wicket凭借其组件化设计深受Java Web开发者青睐。本文详细解析了Wicket项目结构,帮助你构建可维护的大型Web应用。通过示例展示了如何使用Maven管理依赖,并组织页面、组件及业务逻辑,确保代码清晰易懂。Wicket提供的页面继承、组件重用等功能进一步增强了项目的可维护性和扩展性。掌握这些技巧,能够显著提升开发效率,构建更稳定的Web应用。
78 0
|
2月前
|
前端开发 程序员 API
从后端到前端的无缝切换:一名C#程序员如何借助Blazor技术实现全栈开发的梦想——深入解析Blazor框架下的Web应用构建之旅,附带实战代码示例与项目配置技巧揭露
【8月更文挑战第31天】本文通过详细步骤和代码示例,介绍了如何利用 Blazor 构建全栈 Web 应用。从创建新的 Blazor WebAssembly 项目开始,逐步演示了前后端分离的服务架构设计,包括 REST API 的设置及 Blazor 组件的数据展示。通过整合前后端逻辑,C# 开发者能够在统一环境中实现高效且一致的全栈开发。Blazor 的引入不仅简化了 Web 应用开发流程,还为习惯于后端开发的程序员提供了进入前端世界的桥梁。
72 0
|
4月前
|
XML Java 数据格式
java创建xml文件内容
java创建xml文件内容