C#C# ~ 从 XML 到 Linq 到 Linq to 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(拉姆da表明式); 
 :再次来到结果res为
可枚举类型,内存中的表示形式:
  C# 1
 其中,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);

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,待续…    

 1 foreach(XmlNode xnCamp in campList)
 2  {
 3      XmlElement xeCamp = (XmlElement)xnCamp; // 将节点转换为元素,便于得到节点的属性值
 4      string nameCamp = xeCamp.Name;
 5      string yearCamp = xeCamp.GetAttribute("Year").ToString();
 6      string yearCamp = xeCamp.Attributes["Year"].Value; // 此2行代码等价
 7 
 8      XmlElement xeDict =  (XmlElement)xeCamp.SelectSingleNode("DictDatas");
 9      foreach(XmlNode xnDict in xeDict.ChildNodes)
10      {
11         XmlElement xeDict = (XmlElement)xnDict;
12         string isComboBox = xeDict["ComboBox"].InnerText;
13 
14         XmlNodeList itemList = xeDic.SelectNodes("item");
15         foreach (XmlNode xnItem in itemList)
16         {
17             XmlElement xeItem = (XmlElement)xnItem;
18             string value = xeItem.GetAttribute("value").ToString();
19             string innerText = xeItem.InnerText;
20         }
21      }
22  }

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

Linq to XML

 构建对象
 C#:利用匿名类型 var 和对象初阶化器。
 Linq to XML:函数构建形式 (Function
Construction)。此方法得以成立XML文档,并且可以反映XML文档的嵌套结构。需要引用命名空间:using
System.Xml.Linq;
  ◊ . XDocument:XML文档讲明。
  ◊ . XElement:元素。
  ◊ . XAttribute:特性。

 1 XDocument personsDoc = new XDocument(
 2   new XElement("persons", new XAttribute("Nationality","China"),
 3     new XElement("person", new XAttribute("ID","101"),  // 属性
 4       new XElement("Name","sqh"),                      // 元素
 5       new XElement("Sex","male"),
 6       new XElement("City", new XAttribute("Province", "ShanDong"), "WeiFang")
 7     ),
 8     new XElement("person", new XAttribute("ID", "102"),
 9       new XElement("Name", "pm"),
10       new XElement("Sex", "female"),
11       new XElement("City", new XAttribute("Province", "SiChuan"), "NanChong")
12     )
13   ));

 1 personsDoc.Save/Load(); // 保存/加载
 2 XElement root = personsDoc.Root;  // 根结点 
 3 IEnumerable<XElement> rootChilds = root.Elements("person");
 4 foreach (XElement xe in rootChilds){
 5   xe.Name.ToString(), xe.Attribute("ID").Value // 结点/子结点名字及属性
 6   xe.Element("City").Value, xe.Element("City").Attribute("Province").Value
 7 } 
 8 
 9 // 增-Add、删-Remove、改-SetElement
10 root.SetAttributeValue("民族", "汉");  // 增加/修改属性
11 root.Attribute("民族").Remove();       // 删除属性
12 root.Add(new XElement("person", new XAttribute("ID","103"),  // 增加结点
13        new XElement("Name", "ymn"),
14        new XElement("Sex", "female"),
15        new XElement("City", new XAttribute("Province", "HuBei"), "XianNing")
16    ));
17 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
;

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

 

读取方法

  在先后中做客并操作.XML文件一般有两种模型,分别是采纳文档对象模型DOM和流模型。使用DOM的益处在于它同意编辑和换代XML文档,可以无限制走访文档中的数据、可以使用XPath查询,可是,DOM的缺点是急需五次性加载整个文档到内存,对于大型文档会促成资源问题。流模型很好的解决这些题材,因为它对.XML文件的拜访接纳流的定义,也就是说,任几时候内存中唯有当前节点,但它是只读的、向前的,不可以在文档中推行向后导航操作。二种常用的读取XML文件的不二法门:

      • 使用 XmlDocument
      • 使用 XmlTextReader
      • 使用 Linq to Xml

以如下.XML文档为例举办认证:

 1 <?xml version="1.0" encoding="gb2312">
 2 <RootConfig>
 3   <campaigns>
 4      <campaign Year="2015">
 5         <DictDatas Page="p1">
 6             <Dict name="DeviceNo">
 7                 <item value="010">北京</item>
 8                 <item value="021">上海</item>
 9                 <item value="0536">潍坊</item>
10                 <IsComboBox>Yes</IsComboBox>
11             </Dict>
12         </DictDatas>
13      </campaign>
14      <campaign  Year="2016">
15         <DictDatas Page="p1|p2">
16             <Dict name="Student">
17                 <FirstName>Sun</FirstName>
18                 <LastName>Wjcx.com</LastName>
19             </Dict>
20             <Dict name="SexNo">
21                 <item value="1">女</item>
22                 <item value="2">男</item>
23                 <IsComboBox>Yes</IsComboBox>
24             </Dict>
25         </DictDatas>
26         <searchFields Page="p1|p2">
27             <searchField name="SchoolInfo">
28                 <ID>00.00</ID>
29                 <SchoolName>Whut.Seu</SchoolName>
30                 <Address>Wuhan.NanJing</Address>
31             </searchField>
32         </searchFields>     
33      </campaign>
34   </campaigns>
35 </RootConfig>  

.XML

  可扩大标记语言 (Extensible 马克up Language), 标记 (markup)
是着重部分,是正规通用标记语言 (Standard Generalized 马克(Mark)up
Language,SGML)
的子集,一种简单的贮存和领取数额的文本格式,允许用户对友好的标记语言举行定义的源语言。XML数据是分支协会的,社团数据的结构化模式,易于使用和壮大的符号语言,重要用于传输和仓储数据,是各样应用程序之间开展数据传输的常用工具,而HTML紧要用以展现数据。.XML
文件由内容和符号组成,具体地: 

  1. 文档类型定义 (Document Type Definition,DTD),规定文档的逻辑结构;
  2. 可扩充的体裁语言(Extensible Style Language,XSL),规定XML文档样式;
  3. 可扩展链接语言 (Extensible Link
    Language,XLL),襄助Web上已有些简单易行链接; 

XML方便有效地意味着结构化数据,使用XML举行音讯描述和数据互换已经成为总结机软件领域的正规技术情势。通过XML实现数据的规范、结构化,解决了不同平台、不同体系之间数据结构/情势的区别,使数据层在XML技术的扶助下统一起来。

 XML语法

 XML文档用XML阐明、XML名称空间、XML元素和特性构建。阐明定义XML版本,名称空间定义词汇表,元素和特色
定义XML文档的情节。 

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

 元素是XML文档最着重的一些,包含文档的实际数据,元素之间不同意交叉重叠。相较于HTML,XML没有任何预定义的要素和协会。根元素是透过XmlDocument类的习性DocumentElement拿到。重要的类:XDocument、XElement、XAttribute。


3、使用 Linq to Xml

 首先了然下Linq,OK.
 Linq (Language Itergrated Query,语言集成查询)
是停放于C#中的一种多少查询语言,允许以数据库查询的点子查询数据集合,可以在巨型的对象集合、XML、数据库中查询数据。不同的Linq变体(Linq
to Objects、Linq to Entities、Linq to
XML等)可以用来查询、处理不同的数据源(数据库和XML等)。

2、使用 XmlTextReader

待续吧…

相关文章