C#中XML介绍:概念、作用之数据存储与数据交换

[id_1185696227]
[id_6[id_820967639]002650]
XML文件的作用包括:
数据存储方面,XML被广泛采用作为一种存储手段,用以保存应用软件的设置、配置信息以及其它相关数据。以微软的.NET框架为例,其中的配置文件,诸如app.config和web.config,均采用了XML格式。
数据交换方面,XML因其文本属性和极高的可读性而广受欢迎,成为了一种常见的数据交换格式。它能够在众多系统和程序之间进行信息的传递,特别是在Web服务和面向服务的架构(SOA)领域。
数据结构的具体表述是:XML技术能够详细阐述数据的组织形式,它通过使用元素与属性来展现数据的层级关系及其内在含义。这样的做法对于维护数据的一致性与整体性具有重要意义。
XML文件,作为一种文本格式,具备平台无关的特性,能够轻易地在各种操作系统及不同环境中进行迁移与运用。
如其特性所表明,XML具有高度的灵活性,这允许你自行创建定制的标签和文档布局,以便满足个性化需求,无需依赖既定的数据标准。
国际化优势显著:XML兼容Unicode编码,从而能够涵盖人类所有语言中的文本内容,这对构建国际化应用至关重要。
运用XML Schema定义语言(XSD),我们能够设定XML文档的架构与数据类别,同时对其文档进行核实,以此保障数据的准确性。
通过XSLT(可扩展样式表语言转换),能够将XML文件转换成其他格式的文件,比如HTML,以便在网页浏览器中进行展示。
在C#编程语言中,处理XML文件时,你可以借助System.Xml命名空间提供的各类组件,例如XmlDocument、XmlReader、XmlWriter和XmlSerializer等,它们能够实现XML文档的读取、编辑、生成以及序列化操作。
1.2 例子
在C#以及其他的编程语言领域,开发者可以利用特定的库和工具来创建或解读XML格式的信息,无需亲自编写或分析XML的标签及其结构。此类工具通常对数据进行高层次的概括,使得开发者能够借助编程语言中的数据结构来处理数据,随后它们将这些数据结构转化为恰当的XML格式,亦或将XML格式的数据解析为程序可用的数据结构。因此,无需深入探究其语法细节。
以下是一个示例,展示了一个简易的XML文件,其中记载了图书馆藏书的具体信息:
<[id_1948696472]>
<book id="1">
<title>The Great Gatsbytitle>
<author>F. Scott Fitzgeraldauthor>
<year>1925year>
<genre>Fictiongenre>
book>
<book id="2">
<title>Nineteen Eighty-Fourtitle>
<author>George Orwellauthor>
<year>1949year>
<genre>Dystopiangenre>
book>
<book id="3">
<title>To Kill a Mockingbirdtitle>
<author>Harper Leeauthor>
<year>1960year>
<genre>Fictiongenre>
book>
library>
这个XML文档遵循以下结构和特点:
XML文件适用于多种程序与服务的操作,用于获取、展示及处理图书馆藏书的相关资讯。鉴于XML的扩展性,我们能够便捷地增加额外的数据项,例如出版社信息、ISBN编号以及其他元数据。
1.3创建一个xml文件
若我们手中持有C#编写的某个对象,并期望将其内容转化为XML格式,那么我们可以借助XmlSerializer这一工具来实现对象的序列化过程。
using System;
using System.IO;
引用 System.Xml.Serialization 命名空间。
// 假设有一个Book类
public class Book
{
公开属性 Title,支持读取和设置。
公开属性 Author,用于获取或设置作者信息。
public int Year { get; set; }
公开的字符串属性Genre,具有获取和设置的功能。
}
class Program
{
static void Main()
{
// 创建一个Book实例
Book myBook = new Book
{
Title = "The Great Gatsby",
作者名为弗·斯科特·菲茨杰拉德。
Year = 1925,
Genre = "Fiction"
};
// 创建一个XmlSerializer对象来进行序列化
创建一个名为 serializer 的新对象,该对象属于 XmlSerializer 类型,并指定其序列化类型为 Book。
// 使用StreamWriter写入文件
以StreamWriter类实例化一个writer对象,并将其用于创建或打开"D:\\IDE\\book.xml"文件。
{
序列化器将myBook对象的信息写入writer。
}
控制台输出提示:“XML文档已成功创建。”
}
}
在我们的目标地址处,已生成一个文件,但遗憾的是,该文件无法被成功打开。在此,需要特别指出的是,在上述案例中,.NET框架对XML的处理通常涉及将对象转换为XML格式,因此,选用XmlSerializer进行操作是更为恰当的选择。
在处理需读取、编辑XML文件或构建新XML文档架构的情况下,XmlDocument是一个合适的选择。值得注意的是,在.NET Core框架中,XmlDocument已被一个性能更优且更为先进的XDocument类所取代,该类隶属于System.Xml.Linq命名空间,并支持LINQ技术,同时提供了更为简化的API接口。
二、读取XML文件
若获得此类XML文档,应以C#编程语言进行文件读取操作,该文档中详细记录了若干班级学生的资料,包括姓名、年龄、行别及班级等信息。
王五
19
男
机械1班
王六
22
男
机械2班
刘九
21
男
机械3班
阿红
23
女
机械4班
阿七
20
女
机械5班
数据版本信息
我们希望可以这样显示出来:
应该怎么办呢,我们可以按照这样的步骤来进行:
加载XML文件:
获取根节点:
遍历节点:
读取节点信息:
对象映射:
填充数据结构:
绑定到用户界面(可选):
异常处理(建议):
接下来我们就按照这个步骤完后读取xml文件的任务。
2.1加载XML文件
初始化一个XML文档操作类实例,命名为xml_Doc。
文档对象中成功引入了位于指定路径的“StuScore.xml”文件。
我们首先创建了一个名为xml_Doc的XmlDocument实例。XmlDocument是.NET框架内的一种类型,它能够构建一个代表XML文档的对象模型。通过这个类,我们可以执行XML文档的加载、修改以及保存操作。目前,xml_Doc仅代表一个空白的XML文档对象,尚未包含任何具体的数据内容。
我们接着运用了xml_Doc对象(本质上仍为XmlDocument的函数)的Load功能,目的是导入一个名为"StuText.xml"的XML文档。该字符串"StuText.xml"明确了文件的名称及其所在路径。若路径信息未被提供,系统将自动在应用程序当前的工作目录内搜寻该文件。(这里就是文件在程序目录中,所以没有具体路径)。
当调用Load方法时,会有下面几种情况:
xml_Doc对象试图搜寻并解锁目标XML文档。
一旦成功定位并获取该文件,XmlDocument将对其进行内容读取,并据此构建内部的文档对象模型(DOM)树。这棵DOM树呈现出一种节点层级结构,用以体现XML文档的架构,进而支持程序的查询与编辑操作。
在加载过程中若遇到语法错误,诸如标签不匹配或属性格式不当等问题,则会触发XmlException异常,因此,在执行Load方法的相关代码时,必须加入相应的异常处理机制,即try-catch块,以便捕捉并妥善处理这些异常情况。
加载完成之后,您便能够利用xml_Doc对象对XML文档进行访问与编辑。您能够检索特定的节点、属性,或者执行其他查询和修改任务。这些操作不仅能够帮助您提取所需数据,还允许您在内存中对XML文档进行修改,并将这些修改最终保存至文件或其他输出流中。
2.2 获取树的起始节点、提取相关数据、进行数据到对象的转换、构建数据结构,以及将用户界面与数据关联。
xml_Doc的根节点元素被赋值给变量rootNode;这是对XML文档中根目录的引用。
该代码段在加载XML文件之后,成功提取了XmlDocument对象中的文档根节点。根节点位于XML文件结构的最高层级,同时也是所有其他节点的直接上级。
在这里:
rootNode变量存储了XML文档的根元素引用。获得这一引用后,我们能够遍历XML文档中的所有元素,因为这些元素都是从该根元素向下嵌套的。借助这个引用,我们能够对XML文档的不同部分进行访问、编辑或查询。比如,我们可以查看根节点的子节点、属性等。
2.3 遍历节点、
List list = new List();//创建对象集合
对根节点中的各个子节点进行逐一扫描,其中根节点涵盖了所有子节点的集合。
{
若(stuNode的)名称等于"Student",
{
Student对象xml_Stu被成功创建,其类型为Student。
对stuNode中的每个子节点进行遍历,即逐一访问。
{
根据子节点的名称,通过switch语句将其封装至对象的属性之中。
{
case "StuName":
xml_Stu的StuName属性被赋予值,该值来源于subNode的InnerText属性,即《节点名称》所对应的《节点值》。
break;
case "StuAge":
xml_Student的StudentAge属性被赋值为将子节点内部文本转换为16位整型数的结果。
break;
case "Gender":
xml_学生的性别属性被设置为子节点内的文本内容。
break;
case "ClassName":
xml_学生的类名被设置为子节点的内容。
break;
}
}
list.Add(xml_Stu);
}
}
本数据网格视图的学生列表数据源被设置为该列表。
此代码段在C#语言环境下编写,主要功能是从XML文件中提取信息,并将这些信息封装进一个对象集合里。随后,该集合被指定为数据网格视图控件(即我们的显示界面)的数据来源,从而实现数据的用户界面展示。
我们首先建立了一个新的列表,命名为list,该列表的用途是存放Student类型的实体。Student是一个我们自行定义的类别,它包含了诸如StuName(代表姓名)、StuAge(代表年龄)、Gender(代表性别)以及ClassName(代表班级)等属性。
遍历rootNode的子节点,针对每一个stuNode节点,执行操作。
该操作涉及对先前所述根节点的直接后代节点进行逐一扫描。在此次遍历中,stuNode标识了正被访问的子节点。每经过一次循环,都将对单个子节点进行相应的处理。
//
//
这里插播一条直接子节点:
"直接子节点"这一术语,特指在文档对象模型(DOM)树结构中,位于某一节点下一层的节点。在XML或HTML文档中,任何节点,比如一个元素,都可以拥有子节点,这些子节点可能包括元素节点、文本节点,甚至是注释节点等多种类型。
以XML为例,考虑以下简单的结构:
<Parent>
<Child>First childChild>
<Child>Second childChild>
Parent>
在这个例子中,
元素有两个直接子节点,都是元素。这些元素是
元素的直接子节点,因为它们是
第一层的子节点。若这些元素内部包含更多元素,那么这些额外的元素将作为该元素的直接后代节点,而非直接子节点。
的直接子节点。
在操作DOM的过程中,准确地区分“直接子节点”——即某个特定节点的直接一级子节点——以及所有后代节点——涵盖所有层级的子节点——至关重要,因为这种区分将直接影响到我们设计代码时遍历和操作DOM的方式。
///
///
若(stuNode的Name属性值)等于(“Student”)。
在遍历子节点过程中,程序会核对节点名称,若其名为"Student",则表明该节点中储存了学生对象的相关信息。
Student对象xml_Stu被创建,其类型为Student。
当检测到存在一个名为"Student"的节点时,程序将自动生成一个全新的Student对象,并将其命名为xml_Stu。
对Student节点下的每一个子节点进行逐一扫描。
随后,程序对"Student"这一节点下的各个子节点进行遍历,这些子节点中存储了学生的详细信息,例如他们的名字和年龄。
switch (subNode.Name)
{
// ...
}
在当前的switch语句里,程序会依据子节点的名字来决定将节点中的文字内容(即InnerText)分配给xml_Stu对象的哪一个属性。比如,当子节点的名字为"StuName"时,它的文字信息就会被分配给xml_Stu对象的StuName属性。
list.Add(xml_Stu);
当xml_Stu对象的各项属性信息全部填写完毕,该对象便会被纳入list列表之中。
该数据网格视图的学生列表数据源被设置为列表。
最终,名为dgvStuList的数据网格视图控件被指定为list列表的数据来源。该控件隶属于一个Windows窗体应用程序,其功能是展示数据。经过此配置,dgvStuList将负责展示list列表内包含的所有学生资料。
这段代码的功能在于,它能够从XML文档中提取出具有特定结构的数据,比如本例中的学生信息,然后将其转换成相应的C#对象,并最终将这些信息在用户界面中呈现出来。
2.4例子源代码
链接:
提取码:1234