一、     XML简介

XML即可扩展标记语言(EXtensible Markup Language),是一种标记语言,很类似HTML。XML的设计宗旨是传输数据,而非显示数据。XML标签没有被预定义,需要用户定义标签。XML被设计为具有自我描述性并符合W3C的推荐标准。

XML已经被广泛的应用于软件开发的很多方面,特别是Web开发。常用于简化数据的存储和共享。

二、     XML语法

1)  可以根据应用编写有实际意义的标签

比如要描述班级可以定义<Class>标签,要描述学生可以定义<Student>标签。

2)  所有XML标签必须有关闭标签,如:

<Class>高三一班</Class>

</Class>是关闭标签;再如:

<Student>高三一班</Student>

</Student>是关闭标签。

3)  XML标签也是区分大小写的:

<Class>高三一班</class>

上面写法是错误的,因为<Class>和</class>是不同的标签,</class>是<class>的关闭标签,而不是<Class>的关闭标签。

3) XML标签是可以嵌套的,而且必须正确嵌套,所谓嵌套也就是在其内的意思,把握这一点就不难看出一下哪个是错误的了,正确的写法如下:

<Class>

<Student>

</Student>

</Class>

错误的写法:

<Class>

<Student>

</Class>

</Student>

在编写XML代码时,注意保持清晰地层次结构。

4)  XML必须有根元素,根元素有且只能有一个

<Root>

<Child>1</Child>

<Child>2</Child>

<Child>3</Child>

</Root>

5)  可以给XML标签定义属性,属性值必须放在英文半角双引号里面。

<Class Name=”高三一班”>

<Student>

</Student>

</Class>

下面属性是错误的:

<Class Name=高三一班>

<Student>

</Student>

</Class>

6)  实体引用

如果你把字符 "<" 放在 XML 元素中,会发生错误,这是因为解析器会把它当作新元素的开始。

这样会产生 XML 错误:

<message>if salary < 1000 then</message>

为了避免这个错误,请用一个实体引用来代替 "<" 字符:

<message>if salary &lt; 1000 then</message>

在 XML 中,有 5 个预定义的实体引用:

&lt;

<

小于

&gt;

>

大于

&amp;

&

和号

&apos;

'

单引号

&quot;

"

引号

7)  XML中的注释

<!-- This is a comment -->

8)  XML中的空格会被保留,不会被删减。

9)  XML 命名规则

XML 元素必须遵循以下命名规则:

r  名称可以含字母、数字以及其他的字符

r  名称不能以数字或者标点符号开始

r  名称不能以字符 “xml”(或者 XML、Xml)开始

r  名称不能包含空格

r  可使用任何名称,没有保留的字词。

三、     XML验证

XML文档需要遵循下面几点:

r  XML 文档必须有根元素

r  XML 文档必须有关闭标签

r  XML 标签对大小写敏感

r  XML 元素必须被正确的嵌套

r  XML 属性必须加引号

为了确保XML文档是“合法”,用DTD(文档类型定义)进行了验证。DTD 的作用是定义 XML 文档的结构。它使用一系列合法的元素来定义文档结构:

<!DOCTYPE Student [

<!ELEMENT Student (Name,Age)>

<!ELEMENT Name      (#PCDATA)>

<!ELEMENT Age        (#PCDATA)>

]>

验证时的使用方法:

<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE Stude SYSTEM "Student.dtd">

<Student>

<Name>Tom</Name>

<Age>25</Age>

</Student>

也可以将DTD生命于XML文档中:

<?xml version="1.0"?>

<!DOCTYPE Student [

<!ELEMENT Student (Name,Age)>

<!ELEMENT Name      (#PCDATA)>

<!ELEMENT Age        (#PCDATA)>

]>

<Student>

<Name>Tom</Name>

<Age>25</Age>

</Student>

关于以上 DTD 解释如下:

!DOCTYPE Student (第二行)定义此文档是 Student 类型的文档。

!ELEMENT Student (第三行)定义 Student 元素有二个元素:"Name,Age"

!ELEMENT Name (第四行)定义 Name 元素为 "#PCDATA" 类型

!ELEMENT Age (第五行)定义 Age 元素为 "#PCDATA" 类型

PCDATA

PCDATA 的意思是被解析的字符数据(parsed character data)。

可把字符数据想象为 XML 元素的开始标签与结束标签之间的文本。

PDATA 是会被解析器解析的文本。这些文本将被解析器检查实体以及标记。

文本中的标签会被当作标记来处理,而实体会被展开。

不过,被解析的字符数据不应当包含任何 &、< 或者 > 字符;需要使用 &amp;、&lt; 以及 &gt; 实体来分别替换它们。

CDATA

CDATA 的意思是字符数据(character data)。

CDATA 是不会被解析器解析的文本。在这些文本中的标签不会被当作标记来对待,其中的实体也不会被展开。

  XSLT 是首选的 XML 样式表语言。

  XSLT (eXtensible Stylesheet Language Transformations) 远比 CSS 更加完善。

  使用 XSLT 的方法之一是在浏览器显示 XML 文件之前,先把它转换为 HTML

  本文对XSLT不算详细介绍,请读者查阅XSLT相关书籍资料。

四、     编写XML文档

.NET System.XML命名空间下提供的一些类库使得开发人员可以很方便的对XML进行读、写、查。

XmlTextWriter类允许你将XML写到一个文件中去。这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML。下表是XmlTextWriter的方法:

方法名

功能描述

WriteStartDocument

版本为“1.0”的 XML 声明

WriteEndDocument

关闭任何打开的元素或属性

Close

关闭此流和基础流

WriteDocType

写出具有指定名称和可选属性的 DOCTYPE 声明

WriteStartElement

写出具有指定的本地名称的开始标记

WriteEndElement

关闭任何打开的元素或属性

WriteFullEndElement

关闭一个元素,并且总是写入完整的结束标记

WriteElementString

写出包含字符串值的元素

WriteStartAttribute

书写属性的起始内容

WriteEndAttribute

关闭上一个 WriteStartAttribute 调用

WriteRaw

手动书写原始标记

WriteString

书写一个字符串

WriteAttributeString

出具有指定值的属性

WriteCData

写出包含指定文本的 <![CDATA[...]]> 块

WriteComment

写出包含指定文本的注释 <!--...-->

WriteWhiteSpace

写出给定的空白

WriteProcessingInstruction

写出在名称和文本之间带有空格的处理指令,如下所示:<?name text?>

下例是用XmlTextWriter类写的一个简单XML文档:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Xml;

namespace XML

{

class Program

{

static void Main(string[] args)

{

XmlTextWriter writer = new XmlTextWriter("demo.xml", Encoding.UTF8);

//设置自动换行缩进

writer.Formatting = Formatting.Indented;

//XML版本声明

writer.WriteStartDocument();

//根元素

writer.WriteStartElement("Student");

//扩展子元素,这里只写了2个

writer.WriteElementString("Name", "长江");

writer.WriteElementString("Name", "黄河");

//关闭根元素,并书写结束标签

writer.WriteEndElement();

//将XML写入文件并且关闭XmlTextWriter实例对象

writer.Close();

}

}

}

运行后,会在项目根目录/bin/debug文件夹下生成demo.xml,代码如下:

<?xml version="1.0" encoding="utf-8"?>

<Student>

<Name>长江</Name>

<Name>黄河</Name>

</Student>

下面例子,我们增加一些XmlTextWriter类中的方法的应用:

XmlTextWriter writer = new XmlTextWriter("book.xml", null);

writer.WriteStartDocument();

//设置自动缩进

writer.Formatting = Formatting.Indented;

//根元素

writer.WriteStartElement("Books");

//第一个元素

writer.WriteStartElement("Book");

//向先前创建的元素中添加一个属性

writer.WriteAttributeString("BookName", ".NET框架");

//添加子元素

writer.WriteElementString("Author", "Jim");

writer.WriteElementString("Price", "40.00");

//关闭item元素

writer.WriteEndElement(); // 关闭元素

//在节点间添加一些空格

writer.WriteWhitespace("\n");

//使用原始字符串书写第二个元素

writer.WriteRaw("<Book BookName=\"C#\">" +

"<Author>Tom</Author>" +

"<Price>60.00</Price>" +

"</Book>");

//使用格式化的字符串书写第三个元素

writer.WriteRaw("\n <Book BookName=\"ASP.NET\">\n" +

"    <Author>David</Author>\n" +

"    <Price>100.00</Price>\n" +

" </Book>\n");

// 关闭根元素

writer.WriteFullEndElement();

//将XML写入文件并关闭writer

writer.Close();

运行代码后生成的XML文件代码如下:

<?xml version="1.0"?>

<Books>

<Book BookName=".NET框架">

<Author>Jim</Author>

<Price>40.00</Price>

</Book>

<Book BookName="C#"><Author>Tom</Author><Price>60.00</Price></Book>

<Book BookName="ASP.NET">

<Author>David</Author>

<Price>100.00</Price>

</Book>

</Books>

五、     XML读、查、删

上面我们学习了用XmlTextWriter对象创建一个XML文档,在本节里,将继续介绍如何在已有XML文档中查询和插入节点。下面示例在book.xml根节点下加入新的<Book>节点:

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load("book.xml");

//查找<Books>

XmlNode root = xmlDoc.SelectSingleNode("Books");

//创建一个<Book>节点

XmlElement el = xmlDoc.CreateElement("Book");

//设置<Book>节点的属性BookName

el.SetAttribute("BookName", "Windows Application");

//创建<Book>节点的第一个下级节点

XmlElement elSubAuthor = xmlDoc.CreateElement("Author");

elSubAuthor.InnerText = "Jack";

el.AppendChild(elSubAuthor);

//创建<Book>节点的第二个下级节点

XmlElement elSubPrice = xmlDoc.CreateElement("Price");

elSubPrice.InnerText = "70.00";

el.AppendChild(elSubPrice);

//添加<Book>节点到<Books>中

root.AppendChild(el);

xmlDoc.Save("book.xml");

运行代码后,book.xml代码如下,加粗部分是新增的代码:

<?xml version="1.0"?>

<Books>

<Book BookName=".NET框架">

<Author>Jim</Author>

<Price>40.00</Price>

</Book>

<Book BookName="C#">

<Author>Tom</Author>

<Price>60.00</Price>

</Book>

<Book BookName="ASP.NET">

<Author>David</Author>

<Price>100.00</Price>

</Book>

  <Book BookName="Windows Application">

    <Author>Jack</Author>

    <Price>70.00</Price>

  </Book>

</Books>

下面示例演示了如何修改XML节点:

XmlDocument xmlDoc = new XmlDocument();

xmlDoc.Load("book.xml");

XmlNodeList nodeList = xmlDoc.SelectSingleNode("Books").ChildNodes;

foreach (var node in nodeList)

{

XmlElement el = (XmlElement)node;

if (el.GetAttribute("BookName") == "C#")

{

el.SetAttribute("BookName", "精通C#");

}

}

xmlDoc.Save("book.xml");

如果要输出book.xml文档中所有节点的属性和值,可以尝试在上例foreach中实现。

运行后,book.xml的代码如下,原来的“C#”被更改为了“精通C#”。

<?xml version="1.0"?>

<Books>

<Book BookName=".NET框架">

<Author>Jim</Author>

<Price>40.00</Price>

</Book>

<Book BookName="精通C#">

<Author>Tom</Author>

<Price>60.00</Price>

</Book>

<Book BookName="ASP.NET">

<Author>David</Author>

<Price>100.00</Price>

</Book>

<Book BookName="Windows Application">

<Author>Jack</Author>

<Price>70.00</Price>

</Book>

</Books>

如果要删除节点属性请使用RemoveAttribute方法,如果要删除节点请使用RemoveChild方法,也可以使用RemoveAll方法删除所有节点。关于这类方法的使用不再赘述。

另外DataSet也可以读写XML文件:

DataSet ds = new DataSet();
//方法有重载
ds.ReadXml(Server.MapPath("txt.xml"));
//方法有重载
ds.WriteXml(Server.MapPath("txt.xml"));

将字符串保存为XML文件

XmlDocument doc = new XmlDocument();  
doc.LoadXml(txtXMLEditor.Text);
doc.Save(Server.MapPath("XMLFile.xml"));

C#创建XML文档、增删节点类:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;
namespace OperateXml
{
    public class XmlHelper
    {
        /// <summary>
        /// 创建XML文件
        /// </summary>
        /// <param name="fileName">XML文件路径和文件名</param>
        /// <param name="rootElement">XML文件根元素名称</param>
        public static void CreateXmlFile(string fileName,string rootElement)
        {
            if (!File.Exists(fileName))
            {
                //创建Xml文件
                XmlTextWriter writer = new XmlTextWriter(fileName, Encoding.UTF8);
                //设置自动缩进
                writer.Formatting = Formatting.Indented;
                //XML版本声明
                writer.WriteStartDocument();
                //根元素
                writer.WriteStartElement(rootElement);
                //关闭根元素,并书写结束标签
                writer.WriteEndElement();
                //将XML写入文件并且关闭XmlTextWriter实例对象
                writer.Close();
            }
        }

/// <summary>
        /// 添加XML数据
        /// </summary>
        /// <param name="fileName">XML文件路径和文件名</param>
        /// <param name="rootElement">XML文件根元素名称</param>
        /// <param name="itemElement">XML文件二级元素名称</param>
        /// <param name="childElement">XML文件三级元素名称和值</param>
        public static void AppendChildElement(string fileName, string rootElement,string itemElement, Dictionary<string,string> childElement)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(fileName);
            XmlNode root = xmlDoc.SelectSingleNode(rootElement);
            XmlElement el = xmlDoc.CreateElement(itemElement);
            foreach(var item in childElement)
            {
                XmlElement elChild = xmlDoc.CreateElement(item.Key);
                elChild.InnerText = item.Value;
                el.AppendChild(elChild);
            }

root.AppendChild(el);
            xmlDoc.Save(fileName);
        }
        /// <summary>
        /// 删除数据行
        /// </summary>
        /// <param name="fileName">XML文件</param>
        /// <param name="rowNode">顶级节点</param>
        /// <param name="elementID">要查找的三级节点的InnerText,根据此值删除二级节点(一条数据)</param>
        public static void RemoveRecord(string fileName,string rowNode,string elementID)
        {
            XmlDocument xmlDoc = new XmlDocument();
            xmlDoc.Load(fileName);
            XmlNodeList nodeList = xmlDoc.SelectSingleNode(rowNode).ChildNodes;
            foreach (XmlNode node in nodeList)
            {
                XmlElement el = (XmlElement)node;
                XmlNodeList nodeListChild = el.ChildNodes;
                foreach (XmlNode nodeChild in nodeListChild)
                {
                    if (nodeChild.InnerText == elementID)
                    {
                        xmlDoc.SelectSingleNode(rowNode).RemoveChild(node);
                        break;
                    }
                }
            }
            xmlDoc.Save((fileName));
        }
    }
}

转载于:https://www.cnblogs.com/Ferry/archive/2009/07/26/1531223.html

.NET读、写、查、删、改XML文件相关推荐

  1. 改xml文件默认打开方式

    java格式文件的代码提示功能的设置: 1. 打开Eclipse,然后"window"→"Preferences" 2. 选择"java", ...

  2. 写了一个操作XML文件的类

    一个操作XML文件的类..部份功能在完善中~~~~ using System; using System.Collections.Generic; using System.Text; using S ...

  3. dom4j创建、解析xml文件(增删改查)

    先对xml文件进行解析,xml文件如下图所示 <?xml version="1.0" encoding="UTF-8"?> <?eclipse ...

  4. 实验九 使用异步方式实现文件读\写

    实验九 使用异步方式实现文件读\写 一.实验目的 了解Windows系统异步文件读/写的概念. 熟悉Windows系统文件读/写相关的API. 掌握采用异步方式实现文件读/写的相关参数设置. 二.实验 ...

  5. Numpy简易教程7——读/写文件

    读/写文件 NumPy的文件读/写主要有二进制的文件读/写和文件列表形式的数据读/写两种形式.学会读/写文件是利用NumPy进行数据处理的基础.NumPy提供了若干函数,可以把结果保存到二进制或文本文 ...

  6. Unity xml文件制作及导入

    对于初学者而言,在Unity中嵌入xml文件来存储管理游戏数据,游戏质量肯定会有一个飞跃. 1.首先要做的就是创建一个xml文件 (1)新建一个文本文档,文件-另存为- 把文件后缀名改为.xml,保存 ...

  7. 使用QXmlStreamReader读取解析XML文件

    QXmlStreamReader QXmlStreamReader类通过简单的流式API为我们提供了一种快速的读取xml文件的方式.他比Qt自己使用的SAX解析方式还要快. 所谓的流式读取即将一个xm ...

  8. php simplexml 遍历,php下使用SimpleXML 处理XML 文件

    1 SimpleXML 简介 要处理XML 文件,有两种传统的处理思路:SAX 和DOM.SAX 基于事件触发机制, 对XML 文件进行一次扫描,完成要进行的处理:DOM 则将整个XML 文件构造为一 ...

  9. 关于在Android中一个XML文件包含另外一个XML的方法

    在Android界面设计中,有时候需要一个XML主界面需要包含很多的子界面,如果写在同一个XML文件,该文件结构过于复杂,难以维护,因此可以考虑把各个子界面写成独立的XML文件,然后包含到主界面xml ...

  10. tomcat server.xml文件的配置解析

    一直想写个tomcat server.xml文件的配置详细解析,忽然发现网上有人写的挺不错的,这里就转载 :https://www.cnblogs.com/kismetv/p/7228274.html

最新文章

  1. 打通多个视觉任务的全能Backbone:HRNet
  2. Linux 使用记录
  3. mysql 5.6 slave stop_mysql 5.6 Replication 参数
  4. 比人高效10倍,3分钟就能评估帕金森!这是腾讯新推出的AI医生
  5. 用c#语言制作ktv点歌系统,KTV点歌系统的设计与实现的设计和实现(C#,C/S,Access)
  6. ubuntu安装maven_Linux操作系统下将项目发布到Maven中央仓库图文教程
  7. Android 7.1 竖屏转横屏全过程实现-基于高通平台
  8. 摘要算法、对称加密、非对称加密、数字签名、数字证书浅析
  9. uipath数据爬取(结构化数据)
  10. qsdk53:QCA9531+QCA9887生产无法校准问题分析及解决方案
  11. 电工和电气工程师的区别
  12. ZYNQ PL 添加IP 串口UART AXI UART16550
  13. 【NVMe2.0b 9】控制器初始化过程
  14. 利用批处理添加受信任站点
  15. Z05 - 006、网站转化以及漏斗分析(转化分析)
  16. 解决Android 8.1 获取不到wifi名称
  17. 挑战5G测试 思博伦Vertex信道仿真器助力5G研发
  18. uniapp与微信小程序的区别
  19. 全民一起玩python求分享_全民一起玩Python 基础篇+提高篇
  20. ArcGIS二次开发入门(一)

热门文章

  1. 看大厂NLP的面试经验之后的一些思考总结
  2. java tiles类似_java – 更好地替代Apache Tiles
  3. WPF-将DataGrid控件中的数据导出到Excel
  4. iOS开发之HTTP与HTTPS网络请求
  5. oracle10g连接自动断开,报ORA-03135错误
  6. elementui中el-upload自定义上传方法中遇到的问题
  7. 电脑安装系统安装不上的几个问题(解决)
  8. linux高级技巧:rsync同步(二)
  9. 2017.4.5 java中static关键字
  10. 【学习笔记】bootstrap之CSS组件