首页 > 编程语言 >C#操作XML文件

C#操作XML文件

时间:2023-06-03 10:25:35浏览次数:43  
标签:XML 文件 标记 C# System AppendChild HTML xmldoc

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)和序言。
具体规则如下:

  • 必须有声明语句。

XML声明是XML文档的第一句,其格式如下:

<?xml version="1.0" encoding="utf-8"?>
  • 注意大小写

在XML文档中,大小写是有区别的。“A”和“a”是不同的标记。注意在写元素时,前后标记的大小写要保持一致。最好养成一种习惯,或者全部大写,或者全部小写,或者大写第一个字母,这样可以减少因为大小写不匹配而产生的文档错误。

  • XML文档有且只有一个根元素

良好格式的XML文档必须有一个根元素,就是紧接着声明后面建立的第一个元素,其他元素都是这个根元素的子元素,根元素完全包括文档中其他所有的元素。根元素的起始标记要放在所有其他元素的起始标记之前;根元素的结束标记要放在所有其他元素的结束标记之后。

  • 属性值使用引号

在HTML代码里面,属性值可以加引号,也可以不加。但是XML规定,所有属性值必须加引号(可以是单引号,也可以是双引号,建议使用双引号),否则将被视为错误。

  • 所有的标记必须有相应的结束标记

在HTML中,标记可以不成对出现,而在XML中,所有标记必须成对出现,有一个开始标记,就必须有一个结束标记,否则将被视为错误。

  • 所有的空标记也必须被关闭

空标记是指标记对之间没有内容的标记,比如“”等标记。在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,文件,标记,C#,System,AppendChild,HTML,xmldoc
From: https://www.cnblogs.com/HomeSapiens/p/17453398.html

相关文章

  • [ABC303E]
    [ABC303E]AGiftFromtheStars每次合并都是合并入度为\(1\)的点,所以合并的一定不是中心,且被合并后入度是\(2\)。因此如果某个节点的入度\(\ge3\),那么这个节点一定是中心。对于剩余的点,因为保证有解,直接当作大小为\(2\)的星处理。(注意大小为\(2\)的星共\(3\)个点)。......
  • deepin系统更新谷歌浏览器chrome的方法
    deepin系统更新谷歌浏览器chrome的方法1为什么要更新谷歌浏览器谷歌浏览器更新频繁,隔一段时间不更新,打开浏览器时会自动弹出一个提示更新的窗口,有点烦,如果使用python自动处理程序时,如webbrowser.open('http://×.html')语句,不能正确执行。目前,deepin系统谷歌浏览器在国内不能点......
  • COS20019云计算架构
    COS20019CloudComputingArchitecture-Assignment02ScalableCloudComputingArchitecture(30%)Table1.ModificationHistoryDate(created/modified)Purposes2023-04-28Createdtheassignment2023-05-06Finalizetheassignment2023-05-16Revisedassuggested......
  • [HCTF 2018]WarmUp 1 做题笔记
     打开发现什么信息也没有,先看源代码, 发现隐藏信息 source.php试着打开  看到了class.emmm里面有个hint.php提示,试着打开提示flag不在这里,ffffllllaaaagggg,猜测是有四次过滤,再结合上面的classemmm代码,构造file=hint.php,然后试着用../../../../反过滤构造?file......
  • mac电脑git配置sshKey后不能下拉代码
    配置全局gitconfig--globaluser.name用户名gitconfig--globaluser.email邮箱gitconfig--list//查看配置的用户ssh-keygen-trsa-C248******@qq.com//输入邮箱,一直回车(遇到y/n,选y)ls-al~/.ssh//查看是否生成了私钥,公钥(id_rsa是私钥id_rsa.pub是公钥)......
  • windows cmd 命令中使用grep 查找
    有时候我们想使用netstat命令查询具体哪个端口,但是windowsdos自带没有像linux哪样的grep,我们就需要使用第三方插件。下载地址:https://gnuwin32.sourceforge.net/packages/grep.htm 如果无法下载可使用百度网盘下载:链接:https://pan.baidu.com/s/1qpJZ362VBjgWfqJdL24LIA?p......
  • 使用ChatGPT、Dall-E和GPT-4构建AI应用程序
    您可以利用AI的力量来提升您的Web开发技能。我们发布了一门课程,教您如何使用ChatGPT、Dall-E和GPT-4构建AI应用程序。本课程旨在让您掌握创建尖端人工智能应用程序的知识和技能。在本课程中,您将利用OpenAIAPI构建三个项目,并探索ChatGPT、Dall-E和革命性的GPT-4......
  • Scoop软件管理工具
    Scoop为什么选择scoopscoop可以帮你一行代码实现安装软件,省去搭建环境的环节。例如安装python只需一行代码:scoopinstallpython安装在windows终端中输入以下代码设置PowerShell执行策略Set-ExecutionPolicy-ExecutionPolicyRemoteSigned-ScopeCurrentUser下载安......
  • ARL(Asset Reconnaissance Lighthouse)资产侦察灯塔系统
    ARL(AssetReconnaissanceLighthouse)资产侦察灯塔系统   资产灯塔,不仅仅是域名收集简介旨在快速侦察与目标关联的互联网资产,构建基础资产信息库。协助甲方安全团队或者渗透测试人员有效侦察和检索资产,发现存在的薄弱点和攻击面。在开始使用之前,请务必阅读并同意免责声......
  • gitlab--不同的 stage 不重新下载代码、GIT_CHECKOUT、制品 artifacts
    介绍在gitlabci中,不同的stage都会重新下载代码,例如下面的.gitlab-ci.ymldefault:image:ruby:2.7.5stages:#运行的阶段顺序-build-test-deploybuild:#job的名称stage:build#阶段的名称script:-ls-l-echo123>test1.txt#在......