C#中读取XML文件的四种常用方法

2025-02-22 05:50

本文主要是介绍C#中读取XML文件的四种常用方法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧...

XML

简介

Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具。XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用。

格式

实例:

文件名:test.xml

<?xml version="1.0" encoding="UTF-8"?>
<notes>
    <note Type="1">
      <to>Tove</to>
      <from>Jani</from>
      <heading>Reminder</heading>
      <body>Don't forget me this weekend!</body>
    </note>
    <note Type="2">
      <to>Tove</to>
      <from>Jani</from>
      <heading>Reminder</heading>
      <body>Don't forget me this weekend!</body>
    </note>
</notes>

c#读取XML文件方法

使用XmlDocument

使用XmlDocument是一种基于文档结构模型的方式来读取XML文件.在XML文件中,我们可以把XML看作是由文档声明(Declare),元素(Element),属性(Attribute),文本(Text)等构成的一个树.最开始的一个结点叫作根结点,每个结点都可以有自己的子结点.得到一个结点后,可以通过一系列属性或方法得到这个结点的值或其javascript它的一些属性.例如:

  •  xn 代表一个结点
  •  xn.Name;//这个结点的名称 
  •  xn.Value;//这个结点的值 
  •  xn.ChildNodes;//这个结点的所有子结点 
  •  xn.ParentNode;//这个结点的父结点 
  •  .......

操作

//声明XmlDocument对象,并加载XML文件
XmlDocument doc = new XmlDocument();
doc.Load(@"test.xml"); //此处为XML文件的路径

#region 获取节点
//得到根节点node
XmlNode xn = doc.SelectSingleNode("notes");
//得到根节点的所有子节点
XmlNodeList xnl = xn.ChildNodes;

foreach (XmlNode xNode in xnl)
{
    //将节点转换为元素,便于得到节点的属性值
    XmlElement xe = (XmlElement)xNode;
    //得到note节点的属性值
    striChina编程ng noteType = xe.GetAttribute("Type").ToString();
    //得到note节点的所有子节点
    XmlNodeList xnl0 = xe.ChildNodes;
    string body = xnl0.Item(3).InnerText;
    //修改节点值
    xnl0.Item(0).InnerText = "Tovv";
}
#endregion

#region 增加节点 -- 以下是追加
//创建一个节点,并设置节点的属性
XmlElement xelKey = doc.createElement_x("note");
XmlAttribute xelType = doc.CreateAttribute("Type");
xelType.InnerText = "3";
xelKey.SetAttributeNode(xelType);
//创建子节点
XmlElement xelAuthor = doc.createElement_x("to");
xelAuthor.InnerText = "Tang";
x编程elKey.AppendChild(xelAuthor);
//note,并保存整个文件
xn.AppendChild(xelKey);
doc.Save(@"..\..\Book.xml");
#endregion
    
#region 增加节点 -- 以下是覆盖
XmlDocument doc = new XmlDocument();
doc.LoadXml("<notes></notes>");//用这句话,会把以前的数据全部覆盖掉,只有你增加的数据
#endregion

#region 删除节点
XmlElement xe = xmlDoc.DocumentElement; 
string strPath = string.Format("/notes/notes[@Type=\"{0}\"]", dgvbookInfo.CurrentRow.Cells[1].Value.ToString());
XmlElement selectXe = (XmlElement)xe.SelectSingleNode(strPath); //selectSingleNode 根据XPath表达式,获得符合条件的第一个节点. 
selectXe.ParentNode.RemoveChild(selectXe); //移除节点
#endregion

注意

当XML文件中含有注释时,则会出错,因为注释也是一种结点类型,在没有特别说明的情况下,会默认它也是一个结点(Node).所以在把结点转换成元素的时候就会报错.“无法将类型为“System.Xml.XmlComment”的对象强制转换为类型“System.Xml.XmlElement”。”

解决方法:

XmlDocument xmlDoc = new XmlDocument();
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = true;//忽略文档里面的注释 
XmlReader reader = XmlReader.Create(@"..\..\Book.xml", settings);
xmlDoc.Load(reader);

//最后读取完毕后,记得要关掉reader
reader.Close();

使用XmlTextReader/XmlTextWriter

使用XmlTextReader读取数据的时候,首先创建一个流,然后用read()方法来不断的向下读,根据读取的结点的类型来进行相应的操作.

操作

//使用XmlTextReader读文件
XmlTextReader reader = new XmlTextREADER(@"test.xml");

while(reader.Read())
{
    if(reader.NodeType == XmlNodeType.Element)
    {
        //读取节点属性
        if(reader.Name == "note")
        {
            //第一种方法
            string nodeType = reader.GetAttribute(0);
            
     http://www.chinasem.cn       //另一种方法
            for(int i = 0; i < reader.AttributeCount; i++)
            {
                reader.MoveToAttribute(i);
                string str = "属性:" + reader.Name + "=" + reader.Value;
            }
        }
        //读取节点的值
        if(reader.Name == "to")
        {
        	string nodeTo = reader.ReadElementString().Trim();    
        }
        if(reader.Name == "from")
        {
            string nodeFrom = reader.ReadElementString().Trim();
        }
        //当节点类型为尾节点时
        if(reader.NodeType == XmlNodeType.EndElement)
        {
            
        }
    }
}

reader.Close(); //关闭读文件流


//使用XmlTextWriter写文件
//XmlTextWriter写文件的时候,默认是覆盖以前的文件,如果此文件名不存在,它将创建此文件
XmlTextWriter myXmlTextWriter = new XmlTextWriter(@"testphp.xml", null);
//使用 Formatting 属性指定希望将 XML 设定为何种格式。 这样,子元素就可以通过使用 Indentation 和 IndentChar 属性来缩进。 
myXmlTextWriter.Formatting = Formatting.Indented;

myXmlTextWriter.WriteStartDocument(false);
myXmlTextWriter.WriteStartElement("notes"); //写入notes的起始节点

myXmlTextWriter.WriteComment("note information"); //写入注释
myXmlTextWriter.WriteStartElement("note"); //写入note的起始节点

myXmlTextWriter.WriteAttributeString("Type", "3"); //写入note节点的属性

myXmlTextWriter.WriteElementString("to","hong"); //写入note子节点

myXmlTextWriter.WriteEndElement(); //写入note的尾节点
myXmlTextWriter.WriteEndElement(); //写入notes的尾节点

myXmlTextWriter.Flush(); //结束写入
myXmlTextWriter.Close(); //关闭写入流

使用Linq to Xml

Linq是C#3.0中出现的一个新特性,使用它可以方便的操作许多数据源,也包括XML文件.使用Linq操作XML文件非常的方便,而且也比较简单

操作

XElement xe = XElement.Load(@"test.xml");

#region 读取数据
IEnumerable<XElement> elements = from ele in xe.Elements("note") select ele;

foreach(var ele in elements)
{
    //获取节点的属性
	string nodeType = ele.Attribute("Type").Value;
    //获取节点的子节点值
    string nodeTo = ele.Element("to").Value;
}
#endregion

#region 插入数据
XElement record = new XElement(
	new XElement("note",
                 new XAttribute("Type", "3"),
                 new XElement("to", "tang"),
                 new XElmeent("from", "hong")
                )
);
xe.Add(record);
xe.Save(@"test.xml");
#endregion
    
#region 删除数据
//删除选中的数据
IEnumerable<XElement> elements = from ele in xe.Elements("note")
    where (string)ele.Attribute("Type") == 1
    select ele;

if(elements.Count() > 0)
    elements.First().Remove();

xe.Save(@"test.xml");

//删除所有的数据
IEnumerable<XElement> elements = from ele in xe.Elements("note") select ele;

if(elements.Count() > 0)
    elements.Remove();

xe.Save(@"test.xml");
#endregion

#region 修改数据
IEnumerable<XElement> elements = from ele in xe.Elements("note")
    where (string)ele.Attribute("Type") == 1
    select ele;

if(elements.Count() > 0)
{
    XElement first = elements.First();
    //设置新的属性
    first.SetAttributeValue("Type", 5);
    //替换新的节点
    first.ReplaceNodes(
        new XElement("to", "tangtang"),
        new XElmeent("from", "hong")
    );
}
xe.Save(@"test.xml");
#endregion

使用DataSet

ADO.NET对XML提供了强大的支持,其主要事通过数据集与XML进行交互。

操作

DataSet ds = new DataSet();
//读取文件
ds.ReadXml(@"test.xml");

//显示数据
string nodeTo = ds.Tables[0].Rows[0]["to"];
//修改数据
ds.Talbes[0].Rows[0]["to"] = "tos";
//插入数据
DataRow dr = ds.Tables[0].NewRow();
dr["to"] = "dsds";
dr["from"] = "wang";
ds.Tables[0].Rows.Add(dr);
//删除数据
DataRow delR = ds.Tables[0].Rows[0];
ds.Tables[0].Rows.Remove(delR);

//保存数据
ds.WriteXml(@"test.xml");

到此这篇关于C#中读取XML文件的四种常用方法的文章就介绍到这了,更多相关C#读取XML内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程China编程(www.chinasem.cn)!

这篇关于C#中读取XML文件的四种常用方法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1153499

相关文章

JavaScript中的reduce方法执行过程、使用场景及进阶用法

《JavaScript中的reduce方法执行过程、使用场景及进阶用法》:本文主要介绍JavaScript中的reduce方法执行过程、使用场景及进阶用法的相关资料,reduce是JavaScri... 目录1. 什么是reduce2. reduce语法2.1 语法2.2 参数说明3. reduce执行过程

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

oracle DBMS_SQL.PARSE的使用方法和示例

《oracleDBMS_SQL.PARSE的使用方法和示例》DBMS_SQL是Oracle数据库中的一个强大包,用于动态构建和执行SQL语句,DBMS_SQL.PARSE过程解析SQL语句或PL/S... 目录语法示例注意事项DBMS_SQL 是 oracle 数据库中的一个强大包,它允许动态地构建和执行

Ubuntu固定虚拟机ip地址的方法教程

《Ubuntu固定虚拟机ip地址的方法教程》本文详细介绍了如何在Ubuntu虚拟机中固定IP地址,包括检查和编辑`/etc/apt/sources.list`文件、更新网络配置文件以及使用Networ... 1、由于虚拟机网络是桥接,所以ip地址会不停地变化,接下来我们就讲述ip如何固定 2、如果apt安

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.

在不同系统间迁移Python程序的方法与教程

《在不同系统间迁移Python程序的方法与教程》本文介绍了几种将Windows上编写的Python程序迁移到Linux服务器上的方法,包括使用虚拟环境和依赖冻结、容器化技术(如Docker)、使用An... 目录使用虚拟环境和依赖冻结1. 创建虚拟环境2. 冻结依赖使用容器化技术(如 docker)1. 创

Spring排序机制之接口与注解的使用方法

《Spring排序机制之接口与注解的使用方法》本文介绍了Spring中多种排序机制,包括Ordered接口、PriorityOrdered接口、@Order注解和@Priority注解,提供了详细示例... 目录一、Spring 排序的需求场景二、Spring 中的排序机制1、Ordered 接口2、Pri

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

MySql死锁怎么排查的方法实现

《MySql死锁怎么排查的方法实现》本文主要介绍了MySql死锁怎么排查的方法实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录前言一、死锁排查方法1. 查看死锁日志方法 1:启用死锁日志输出方法 2:检查 mysql 错误