C# ~ 从 XML 到 Linq 到 Linq to XML
可扩展标记语言 (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 到 Linq 到 Linq to XML的更多相关文章
- LinqToXml (一) Create Xml file By Dom /Linq
目前,在xml 应用编程领域比较流行的开发模型是W3C 提供的DOM(文档对象模型),在.net Framework 通过命名空间 System.Xml 对该技术提供了支持.随着Linq to XMl ...
- Linq之Linq to XML
目录 写在前面 系列文章 linq to xml 总结 写在前面 在很多情况下,都可以见到使用xml的影子.例如,在 Web 上,在配置文件.Microsoft Office Word 文件(将wor ...
- 使用Linq快速的操作XML
开始内容之前先分享一段话 有时候,当你知道要做什么的时候就做的很快,比如你要实现个功能,码字的活儿不算很难,做个检索也不会有什么难倒你的.但是,做着做着,你发现好像世界上的工作都在重复,于是你有种心要 ...
- 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文档在 ...
- Linq之Linq to Sql
目录 写在前面 系列文章 Linq to sql 总结 写在前面 上篇文章介绍了linq to xml的相关内容,linq to xml提供一种更便捷的创建xml树,及查询的途径.这篇文章将继续介绍l ...
- Linq技术四:动态Linq技术 -- Linq.Expressions
前面介绍了Linq的三个方面应用:Linq to SQL, Linq to XML和Linq to Object,这篇介绍一下动态Linq的实现方式及应用场景. 命名空间: System.Linq; ...
- LINQ之LINQ to Objects(上)
LINQ概述 LINQ,语言集成查询(Language Integrated Query),它允许使用C#或VB代码以查询数据库相同的方式来操作不同的数据源. 1.LINQ体系结构 从上图可以看出,L ...
- 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). 其次是 ...
- XML系列之--对电文格式XML的简单操作(三)
前两章介绍了关于Linq创建.解析SOAP格式的XML,在实际运用中,可能会对xml进行一些其它的操作,比如基础的增删该查,而操作对象首先需要获取对象,针对于DOM操作来说,Linq确实方便了不少,如 ...
随机推荐
- HBase Java简单示例
Hbase采用Java实现,原生客户端也是Java实现,其他语言需要通过thritf接口服务间接访问Hbase的数据. Hbase作为大数据存储数据库,其写能力非常强,加上Hbase本身就脱胎于Had ...
- Android Activity的生命周期简单总结
Android Activity的生命周期简单总结 这里的内容参考官方的文档,这篇文章的目的不是去总结Activity是如何启动,如何创造,以及暂停和销毁的,而是从实际开发中分析在Activity各个 ...
- 关于js内部运行机制的一本好书
读<单页Web应用一书>,第二章讲了js内部运行机制,感觉棒极了.之前读<你不知道的js>,看的云里雾里,似懂非懂.没想到单页Web一书将此内容讲的如此通俗易懂,好多困惑已久的 ...
- NSString NSUrl 相互转化
//NSString 转为 NSURL NSString *webStr = @"www.baidu.com"; NSURL *webUrl = [NSURL URLWithStr ...
- Android笔记——活动的生命周期
一.活动的重要性 掌握活动的生命周期对任何 Android 开发者来说都非常重要,当你深入理解活动的生命周期之后,就可以写出更加连贯流畅的程序,并在如何合理管理应用资源方面,你会发挥的游刃有余.你的应 ...
- ViewPager 的页面重置问题
当我们使用ViewPager控件时,假设我们的ViewPager有三页,当我们第一次启动ViewPager显示第一页的时候,ViewPager会预加载第二页,这样当我们向第二页滑动的时候就可以看见第二 ...
- 对于System.Net.Http的学习(二)——使用 HttpClient 进行连接
对于System.Net.Http的学习(一)——System.Net.Http 简介 使用 HttpClient 进行连接 使用 System.Net.Http 命名空间中的 HttpClient ...
- HTML中的title换行问题
有时我们需要在html元素的title中换行显示信息.以下几种方法均可以实现: 直接在titile属性中使用换行,如下所示: asd">asdsadsad</a> 在tit ...
- sql 循环处理表数据中当前行和上一行中某值相+/-
曾经,sql中循环处理当前行数据和上一行数据浪费了我不少时间,学会后才发现如此容易,其实学问就是如此,难者不会,会者不难. 以下事例,使用游标循环表#temptable中数据,然后让当前行和上一行中的 ...
- Codeforces Round #380 (Div. 2) 总结分享
B. Spotlights 题意 有n×m个格子的矩形舞台,每个格子里面可以安排一个演员或聚光灯,聚光灯仅可照射一个方向(俯视,上下左右).若聚光灯能照到演员,则称为"good positi ...