可扩展标记语言 (Extensible Markup Language), 标记 (markup) 是关键部分,是标准通用标记语言 (Standard Generalized Markup Language,SGML) 的子集,一种简单的存储和提取数据的文本格式。

XML数据分层组织,主要用于传输和存储数据,而HTML主要用于显示数据。.

XML文件由内容和标记组成,具体地: 

  • 文档类型定义 (Document Type Definition,DTD),规定文档的逻辑结构;
  • 可扩展的样式语言(Extensible Style Language,XSL),规定XML文档样式;
  • 可扩展链接语言 (Extensible Link Language,XLL),支持Web上已有的简单链接; 

XML结构化数据,解决了不同平台系统间数据结构/模式的差异。

XML文档用XML声明、XML名称空间、XML元素和特性构建。声明定义XML版本,名称空间定义词汇表,元素和特性 定义XML文档的内容。 

<?xml version="1.0" encoding="gb2312"?>

元素是XML文档最重要的部分,相较于HTML,XML没有任何预定义的元素和结构。

在程序中访问并操作.XML文件一般有两种模型,分别是使用

  • 文档对象模型DOM
  • 流模型

使用DOM的好处在于它允许编辑和更新XML文档,可以随机访问文档中的数据、可以使用XPath查询,但是,DOM的缺点是需要一次性加载整个文档到内存,对于大型文档会造成资源问题。

流模型对.XML文件的访问采用流的概念,任何时候内存中只有当前节点,但它是只读的、向前的,不能在文档中执行向后导航操作。

三种常用的读取XML文件的方法:

  • XmlDocument
  • XmlTextReader
  • Linq to Xml

以如下.XML文档为例进行说明:

<?xml version="1.0" encoding="gb2312">
<RootConfig>
<campaigns>
<campaign Year="2015">
<DictDatas Page="p1">
<Dict name="DeviceNo">
<item value="010">北京</item>
<item value="021">上海</item>
<item value="0536">潍坊</item>
<IsComboBox>Yes</IsComboBox>
</Dict>
</DictDatas>
</campaign>
<campaign Year="2016">
<DictDatas Page="p1|p2">
<Dict name="Student">
<FirstName>Sun</FirstName>
<LastName>Wjcx.com</LastName>
</Dict>
<Dict name="SexNo">
<item value="1">女</item>
<item value="2">男</item>
<IsComboBox>Yes</IsComboBox>
</Dict>
</DictDatas>
<searchFields Page="p1|p2">
<searchField name="SchoolInfo">
<ID>00.00</ID>
<SchoolName>Whut.Seu</SchoolName>
<Address>Wuhan.NanJing</Address>
</searchField>
</searchFields>
</campaign>
</campaigns>
</RootConfig>

1、使用XmlDocument   

XmlDocument基于文档结构模型方式读取.XML,可以把.XML文件看作是由文档声明(Declare)、元素(Element)、属性(Attribute)、文本(Text)等构成的一棵树,通过一系列属性或方法得到结点的值或其它属性:

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

使用时首先声明一个XmlDocument对象,调用Load方法,从指定路径加载XML文件,推荐格式:

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

具体属性和方法: 

XmlNode xnCamps = doc.SelectSingleNode("campaigns"); // 定位结点
XmlNodeList campList = doc.SelectNodes("campaign"); // 定位结点链表
XmlNodeList campList = doc.SelectNodes("campaign[Year<='2016']");

关于定位结点,有必要学习XML文档的查询语言:xPath,待续… 

foreach(XmlNode xnCamp in campList)
{
XmlElement xeCamp = (XmlElement)xnCamp; // 将节点转换为元素,便于得到节点的属性值
string nameCamp = xeCamp.Name;
string yearCamp = xeCamp.GetAttribute("Year").ToString();
string yearCamp = xeCamp.Attributes["Year"].Value; // 此2行代码等价 XmlElement xeDict = (XmlElement)xeCamp.SelectSingleNode("DictDatas");
foreach(XmlNode xnDict in xeDict.ChildNodes)
{
XmlElement xeDict = (XmlElement)xnDict;
string isComboBox = xeDict["ComboBox"].InnerText; XmlNodeList itemList = xeDic.SelectNodes("item");
foreach (XmlNode xnItem in itemList)
{
XmlElement xeItem = (XmlElement)xnItem;
string value = xeItem.GetAttribute("value").ToString();
string innerText = xeItem.InnerText;
}
}
}

以上代码仅供学习参考,欢迎批评指正。

2、使用 XmlTextReader

待续吧…

3、使用 Linq to Xml

Linq (Language Itergrated Query,语言集成查询) 是内置于C#中的一种数据查询语言,允许以数据库查询的方式查询数据集合,可以在大型的对象集合、XML、数据库中查询数据。

不同的Linq变体(Linq to Objects、Linq to Entities、Linq to XML等)可以用于查询、处理不同的数据源(数据库和XML等)。

Linq

a. 查询语法 Query Syntax
 声明形式。利用查询表达式。简单易理解,推荐。
 查询表达式:from…select子句,group子句,where子句,join子句,orderby子句等。
 · join 子句
  用一个查询搜索两个列表中的相关数据,用键字段把结果链接起来。
   from c in Table1
   join o in Table2 on c.ID equals o.ID
 · group 子句
  分组键用 key 区分,返回结果 res 是关于 key 的可枚举类型(分组),每个组也是可枚举类型。  
b. 方法语法 Method Ayntax
 命令形式。利用标准查询运算符。特殊情况需要传送函数或方法,以委托的形式。注意,方法调用顺序并不固定,因为Linq方法调用返回的类型都实现了 IEnumerable<T> 接口,但是应根据查询特性,合理安排调用顺序。
 System.Linq.Enumerable类声明了标准查询运算符的方法,是扩展了泛型 IEnumerable<T> 的 扩展方法:公共静态方法,参数列表以 this 开始!
 · 直接语法调用:Enumerable.Function(可枚举类型实例);
 · 扩展语法调用:可枚举类型实例.Function();或 可枚举类型实例.Function(Lambda表达式); 
:返回结果res为 可枚举类型,内存中的表示形式:
 
其中,res 并不保存查询结果,而是指向 IEnumerable<T>类型的对象。当处理枚举类型时,查询表达式才会执行(延迟执行)。

聚合运算符:查询大型数据集,分析查询结果。

Count()、Max()、Min()、Average()、Sum()

投影 Projection:在查询中创建新的对象。
a. 投影查询的查询语法
 在select子句中利用 new{…} 创建新对象,不能采用 select + 字段列表 的形式。
b. 投影查询的方法语法
 调用Linq的 Select(Lambda表达式) 方法。
多级排序
a. 查询语法
 orderby + 字段列表。
b. 多级排序的方法语法
 OrderBy().ThenBy()/ThenByDescending()方法。
组合查询 group
把数据分解为组,允许按组来排序、计算聚合值以及进行比较。

分组产生的结果集实现了Linq接口 IEnumerable<IGrouping>,支持 key 属性,所以组合查询中的数据通过一个键(Key)字段来组合,每个组中的所以数据共享这个字段值。
<-!- 几种常用方法 -!->
◊. 分区运算符
 - Take():从查询结果中提取前n个结果;
 - Skip():与Take()相反,跳过前n个结果,返回剩余的结果;
◊. 条件查询运算符
 - First():返回结果集中第一个匹配给定条件的元素;
 - FirstOrDefault():查询条件不满足,返回默认元素,而不必添加错误处理代码;
◊. 标准的集(合)运算符 set operator
 - Intersect():交集,QryRes1.Intersect(QryRes2);
 - Except():差集,QryRes1.Except(QryRes2);
 - Union():并集,QryRes1.Union(QryRes2);

Linq to XML

构建对象
C#:利用匿名类型 var 和对象初始化器
Linq to XML:函数构建方式 (Function Construction)。此方式可以创建XML文档,并且可以反映XML文档的嵌套结构
 ◊ . XDocument:XML文档声明
 ◊ . XElement:元素
 ◊ . XAttribute:特性

XDocument personsDoc = new XDocument(
  new XElement("persons", new XAttribute("Nationality","China"),
    new XElement("person", new XAttribute("ID","101"), // 属性
      new XElement("Name","sqh"), // 元素
     new XElement("Sex","male"),
     new XElement("City", new XAttribute("Province", "ShanDong"), "WeiFang")
   ),
   new XElement("person", new XAttribute("ID", "102"),
      new XElement("Name", "pm"),
      new XElement("Sex", "female"),
      new XElement("City", new XAttribute("Province", "SiChuan"), "NanChong")
    )
  ));

操作方法如下

personsDoc.Save/Load(); // 保存/加载
XElement root = personsDoc.Root; // 根结点
IEnumerable<XElement> rootChilds = root.Elements("person");
foreach (XElement xe in rootChilds){
  xe.Name.ToString(), xe.Attribute("ID").Value // 结点/子结点名字及属性
  xe.Element("City").Value, xe.Element("City").Attribute("Province").Value
} // 增-Add、删-Remove、改-SetElement
root.SetAttributeValue("民族", "汉"); // 增加/修改属性
root.Attribute("民族").Remove(); // 删除属性
root.Add(new XElement("person", new XAttribute("ID","103"), // 增加结点
       new XElement("Name", "ymn"),
       new XElement("Sex", "female"),
       new XElement("City", new XAttribute("Province", "HuBei"), "XianNing")
   ));
xe.Remove(); // 删除结点

利用 Linq 查询表达式进行 XML 树搜索。

// 查 - Linq to Xml
var res = from xe in root.Elements("person")
      where int.Parse(xe.Attribute("ID").Value) <= 102
      select new { Name = xe.Element("Name").Value, City = xe.Element("City").Value};

参考
c# 读取XML - 1; - c# 读取XML - 2; 
关于XmlReader/XmlWriter 类;

Linq系列 ~ Linq to XML;
LINQ to XML 建立,读取,增,删,改;

C# ~ 从 XML 到 Linq 到 Linq to XML的更多相关文章

  1. LinqToXml (一) Create Xml file By Dom /Linq

    目前,在xml 应用编程领域比较流行的开发模型是W3C 提供的DOM(文档对象模型),在.net Framework 通过命名空间 System.Xml 对该技术提供了支持.随着Linq to XMl ...

  2. Linq之Linq to XML

    目录 写在前面 系列文章 linq to xml 总结 写在前面 在很多情况下,都可以见到使用xml的影子.例如,在 Web 上,在配置文件.Microsoft Office Word 文件(将wor ...

  3. 使用Linq快速的操作XML

    开始内容之前先分享一段话 有时候,当你知道要做什么的时候就做的很快,比如你要实现个功能,码字的活儿不算很难,做个检索也不会有什么难倒你的.但是,做着做着,你发现好像世界上的工作都在重复,于是你有种心要 ...

  4. XML操作:2.LINQ TO XML(http://www.cnblogs.com/AlexLiu/archive/2008/10/27/linq.html)

    LINQ to XML 建立,读取,增,删,改   LINQ to XML的出现使得我们再也不需要使用XMLDocument这样复杂的一个个的没有层次感的添加和删除.LINQ可以使的生成的XML文档在 ...

  5. Linq之Linq to Sql

    目录 写在前面 系列文章 Linq to sql 总结 写在前面 上篇文章介绍了linq to xml的相关内容,linq to xml提供一种更便捷的创建xml树,及查询的途径.这篇文章将继续介绍l ...

  6. Linq技术四:动态Linq技术 -- Linq.Expressions

    前面介绍了Linq的三个方面应用:Linq to SQL, Linq to XML和Linq to Object,这篇介绍一下动态Linq的实现方式及应用场景. 命名空间: System.Linq; ...

  7. LINQ之LINQ to Objects(上)

    LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. 1.LINQ体系结构 从上图可以看出,L ...

  8. C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)

    学习书籍: <C#本质论> 1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是 ...

  9. XML系列之--对电文格式XML的简单操作(三)

    前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...

随机推荐

  1. 跨站脚本攻击XSS

    跨站脚本攻击(Cross Site Script为了区别于CSS简称为XSS)指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到 ...

  2. Technical reading July-15

    http://modernuicharts.codeplex.com/ WPF chart http://www.dotnetcurry.com/showarticle.aspx?ID=1027

  3. Java中常用修饰符使用汇总

    修饰符汇总: 一:public protected default private 修饰类,修饰方法,修饰属性,修饰代码块.  类: 顶级类只能用public 修饰,顶级类不能使用private 和p ...

  4. Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier),

    Atitit 深入了解UUID含义是通用唯一识别码 (Universally Unique Identifier), UUID1 作用1 组成1 全球唯一标识符(GUID)2 UUID 编辑 UUID ...

  5. Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针

    Atitit java方法引用(Method References) 与c#委托与脚本语言js的函数指针   1.1. java方法引用(Method References) 与c#委托与脚本语言js ...

  6. Piwik 扩展获取客户端IP地址

    piwik 数据库浏览记录存放在piwik_log_visit表中 piwik_log_visit 表有个location_ip字段,该字段存储为Byte[]字节 解析出来后的IP地址为 XXX.XX ...

  7. 谷毅(WingKu)横空出世

    天空划出一道彩虹,谷毅(WingKu)横空出世,这里的产品全由本人开发制作,如有雷同不胜荣幸,欢迎前往下载使用,如果有啥建议或者使用当中遇到什么问题,也可在此留言评论~OK,开张啦~!以后每个产品会以 ...

  8. 学习ASP.NET MVC(五)——我的第一个ASP.NET MVC CURD页面

    在上一篇文章中我们已经创建了实体类,在这一篇文章中,我将创建一个新的控制器类——BookController,使用BookController对Books表中的数据进行CURD操作的方法,并使用视图模 ...

  9. 部署到IIS报错:HTTP错误500.19,错误代码0x800700d

    title=部署到IIS报错:HTTP错误500.19,错误代码0x800700d.   用vs直接运行网站没问题,部署到IIS就报错,由此可知应该是IIS中不支持网站相关配置. 查找发现在web.c ...

  10. Tmux - Linux从业者必备利器

    本文详细介绍tmux的概念和搭建过程 本博客已经迁移至: http://cenalulu.github.io/ 为了更好的体验,请通过此链接阅读: http://cenalulu.github.io/ ...