• 1. LINQ to XML
  • 2. 知识点什么是LINQ to XML LINQ to XML 类简介 创建XML树 序列化XML树 使用XML命名空间 LINQ树查询 修改XML树
  • 3. 什么是LINQ to XMLLINQ to XML 是一种启用了 LINQ 的内存 XML 编程接口,使用它,可以在 .NET Framework 编程语言中处理 XML。 LINQ to XML 将 XML 文档置于内存中,这一点很像文档对象模型 (DOM)。您可以查询和修改 XML 文档,修改之后,可以将其另存为文件,也可以将其序列化然后通过 Internet 发送。但是,LINQ to XML 与 DOM 不同:它提供一种新的对象模型,这是一种更轻量的模型,使用也更方便,这种模型利用了 C# 3.0 在语言方面的改进。 LINQ to XML 最重要的优势是它与 语言集成查询 (LINQ) 的集成。由于实现了这一集成,因此,可以对内存 XML 文档编写查询,以检索元素和属性的集合。LINQ to XML 的查询功能在功能上(尽管不是在语法上)与 XPath 和 XQuery 具有可比性。 LINQ to XML 的另一个优势是通过将查询结果用作 XElement和 XAttribute对象构造函数的参数,实现了一种功能强大的创建 XML 树的方法。这种方法称为“函数构造”,利用这种方法,开发人员可以方便地将 XML 树从一种形状转换为另一种形状。
  • 4. Linq To XmL体验 IEnumerable partNos = from item in purchaseOrder.Descendants("Item") select (string)item.Attribute("PartNumber"); XElement appXml = XElement.Load("app.config"); var v = appXml.Descendants("add").First().Attribute("connectionString"); Console.WriteLine(v); var conn = from em in app.Descendants("add") select em.Attribute("connectionString");
  • 5. System.Xml.Linq1.System.Xml.Linq简介 类说明Extensions 包含 LINQ to XML 扩展方法。XAttribute 表示一个 XML 属性。XCData 表示一个包含 CDATA 的文本节点。XComment 表示一个 XML 注释。XContainer 表示可包含其他节点的节点。XDeclaration 表示一个 XML 声明。XDocument 表示 XML 文档。XDocumentType 表示 XML 文档类型定义 (DTD)。XElement 表示一个 XML 元素。XName 表示 XML 元素或特性的名称。XNamespace 表示一个 XML 命名空间。 无法继承此类。XNode 表示 XML 树中节点的抽象概念(元素、注释、文档类型、处理指令或文本节点)。XNodeDocumentOrderComparer 包含用于比较节点的文档顺序的功能。 无法继承此类。XNodeEqualityComparer 比较节点以确定其是否相等。 无法继承此类。XObject 表示 XML 树中的节点或特性。XObjectChangeEventArgs 提供有关 Changing 和 Changed 事件的数据。XProcessingInstruction 表示 XML 处理指令。XStreamingElement 表示支持延迟流输出的 XML 树中的元素。XText 表示一个文本节点。
  • 6. LINQ to XML 三个最重要类XElement类 XAttribute类 XDocument类
  • 7. XElement类XElement 类是 LINQ to XML 中的基础类之一。它表示一个 XML 元素。可以使用该类创建元素;更改元素内容;添加、更改或删除子元素;向元素中添加属性;或以文本格式序列化元素内容。还可以与 System.Xml 中的其他类(例如 XmlReader、XmlWriter 和 XslCompiledTransform)进行互操作。 Xelement常用 构造函数 XElement(XName name, object content)创建一个 XElement。name 参数指定元素的名称;content 指定元素的内容XElement(XName name)创建一个 XElement,其 XName 初始化为指定名称。XElement(XName name, params object[] content)创建一个 XElement,其 XName 初始化为指定名称。从参数列表的内容创建属性和/或子元素。
  • 8. XElement创建Xml树 XElement contacts = new XElement("Contacts", new XElement("Contact", new XElement("Name", "Patrick Hines"), new XElement("Phone", "206-555-0144"), new XElement("Address", new XElement("Street1", "123 Main St"), new XElement("City", "Mercer Island"), new XElement("State", "WA"), new XElement("Postal", "68042") ) ) );XElement n = new XElement("Customer", "Adventure Works"); 例一例二
  • 9. 使用 LINQ 查询的结果来填充 XML 树 XElement srcTree = new XElement("Root", new XElement("Element", 1), new XElement("Element", 2), new XElement("Element", 3), new XElement("Element", 4), new XElement("Element", 5) ); XElement xmlTree = new XElement("Root", new XElement("Child", 1), new XElement("Child", 2), from el in srcTree.Elements() where (int)el > 2 select el );
  • 10. XAttribute类属性是与元素关联的名称/值对。 XAttribute 类表示 XML 属性。 使用 LINQ to XML 中的属性,与使用元素非常相似。 它们的构造函数相似。 用于检索它们的集合的方法相似。 属性集合的 LINQ 查询表达式与元素集合的 LINQ 查询表达式看起来非常相似。 将属性添加到元素中的顺序会保留下来。 也就是说,当循环访问属性时,所见到的属性顺序与它们的添加顺序相同
  • 11. 创建具有属性的元素构造函数说明XAttribute(XName name, object content)创建一个 XAttribute 对象。name 参数指定属性的名称;content 指定属性的内容。下面的 XAttribute 类构造函数是最常使用的构造函数之一: XElement phone = new XElement("Phone", new XAttribute("Type", "Home"), "555-555-5555");
  • 12. XDocument类XDocument 类包含有效的 XML 文档所需的信息。其中包括 XML 声明、处理指令和注释。 请注意,如果需要 XDocument 类提供的特定功能,您只需创建 XDocument 对象。在很多情况下,可以直接使用 XElement。直接使用 XElement 是一种比较简单的编程模型。 XDocument 是从 XContainer 派生的。因此,它可以包含子节点。但是,XDocument 对象只能有一个子 XElement 节点。这反映了 XML 标准,即在 XML 文档中只能有一个根元素。
  • 13. XDocument 可以包含以下元素XDocument 可以包含以下元素: 一个 XDeclaration 对象。XDeclaration 使您能够指定 XML 声明的相关部分:XML 版本、文档的编码以及 XML 文档是否是独立的。 一个 XElement 对象。这是 XML 文档的根节点。 任意数目的 XProcessingInstruction 对象。处理指令将信息传递给处理 XML 的应用程序。 任意数目的 XComment 对象。注释将与根元素同级。XComment 对象不能是列表中的第一个参数,因为 XML 文档以注释开头无效。 一个用于 DTD 的 XDocumentType。
  • 14. 使用 XDocument XDocument d = new XDocument( new XComment("This is a comment."), new XProcessingInstruction("xml-stylesheet", "href='mystyle.css' title='Compact' type='text/css'"), new XElement("Pubs", new XElement("Book", new XElement("Title", "Artifacts of Roman Civilization"), new XElement("Author", "Moreno, Jordao") ), new XElement("Book", new XElement("Title", "Midieval Tools and Implements"), new XElement("Author", "Gazit, Inbar") ) ), new XComment("This is another comment.") ); d.Declaration = new XDeclaration("1.0", "utf-8", "true");
  • 15. Adding Elements to an XML Tree 方法说明Add在 XContainer 的子内容的末尾添加内容。AddFirst在 XContainer 的子内容的开头添加内容。方法说明AddAfterSelf在 XNode 后面添加内容。AddBeforeSelf在 XNode 前面添加内容。
  • 16. Add XElement srcTree = new XElement("Root", new XElement("Element1", 1), new XElement("Element2", 2), new XElement("Element3", 3), new XElement("Element4", 4) ); XElement xmlTree = new XElement("Root", new XElement("Child1", 1), new XElement("Child2", 2) ); xmlTree.Add(new XElement("NewChild", "new content")); xmlTree.Add( from el in srcTree.Elements() where (int)el > 3 select el ); xmlTree.Add(new XElement("cccc")); // Even though Child9 does not exist in srcTree, the following statement will not // throw an exception, and nothing will be added to xmlTree. xmlTree.Add(srcTree.Element("Child9")); Console.WriteLine(xmlTree);
  • 17. XContainer.AddFirst 方法 XElement srcTree = new XElement("Root", new XElement("Element1", 1), new XElement("Element2", 2), new XElement("Element3", 3), new XElement("Element4", 4), new XElement("Element5", 5) ); XElement xmlTree = new XElement("Root", new XElement("NewElement", "Content") ); xmlTree.AddFirst( from el in srcTree.Elements() where (int)el >= 3 select el ); Console.WriteLine(xmlTree); 此方法将新内容添加到 XContainer 的现有内容之前。
  • 18. 修改 Elements, Attributes, and Nodes方法说明XAttribute.Value获取或设置特性的值。。XAttribute.SetValue设置属性的值。 下面的方法修改 XAttribute。 方法说明XNode.ReplaceWith用新内容替换节点。下面的方法修改 XNode(包括 XElement 或 XDocument)。方法说明XContainer.ReplaceNodes用新内容替换子节点。下面的方法修改 XContainer(XElement 或 XDocument)。
  • 19. XAttribute.Value使用此属性可以获取或设置特性的值。 XElement root = new XElement("Root", new XAttribute("Att", "content") ); XAttribute att = root.FirstAttribute; Console.WriteLine(att.Value); att.Value = "new text"; Console.WriteLine(att.Value); Console.WriteLine(root);
  • 20. XNode.ReplaceWith 方法 使用指定的内容替换此节点。 XElement xmlTree = new XElement("Root", new XElement("Child1", "child1 content"), new XElement("Child3", "child2 content"), new XElement("Child3", "child3 content"), new XElement("Child4", "child4 content"), new XElement("Child5", "child5 content") ); XElement child3 = xmlTree.Element("Child3"); child3.ReplaceWith( new XElement("NewChild", "new content") );
  • 21. XContainer.ReplaceNodes 方法使用指定的内容替换此文档或元素的子节点。 XElement root=new XElement("Root", new XElement("Child", 1), new XElement("Child", 2), new XElement("Child", 3), new XElement("Child", 4), new XElement("Child", 5) ); root.ReplaceNodes( from el in root.Elements() where (int)el >= 3 select el );
  • 22. Removing Elements, Attributes, and Nodes方法说明[M:System.Xml.Linq.XAttribute.Remove()]从父属性中移除 XAttribute。[M:System.Xml.Linq.XContainer.RemoveNodes()]从 XContainer 中移除子节点。XElement.RemoveAll从 XElement 中移除内容和属性。XElement.RemoveAttributes移除 XElement 的属性。XElement.SetAttributeValue如果传递 null 作为值,则移除该属性。XElement.SetElementValue如果传递 null 作为值,则移除该子元素。XNode.Remove从父节点中移除 XNode。Extensions.Remove从父元素中移除源集合中的每个属性或元素。
  • 23. 实例1 XElement root = XElement.Parse(@" "); root.Element("Child1").Element("GrandChild1").Remove(); root.Element("Child2").Elements().ToList().Remove(); root.Element("Child3").Elements().Remove();
  • 24. 实例2 // Create an element with no content. XElement root = new XElement("Root"); // Add some name/value pairs. root.SetAttributeValue("Att1", 1); root.SetAttributeValue("Att2", 2); root.SetAttributeValue("Att3", 3); Console.WriteLine(root); // Modify one of the name/value pairs. root.SetAttributeValue("Att2", 22); Console.WriteLine(root); // Remove one of the name/value pairs. root.SetAttributeValue("Att3", null); Console.WriteLine(root);
  • 25. Extensions.Remove实例3 XElement root =new XElement("Root", new XAttribute("Att1", 1), new XAttribute("Att2", 2), new XAttribute("Att3", 3), new XAttribute("Att4", 4), new XAttribute("Att5", 5) ); IEnumerable atList = from at in root.Attributes() where (int)at >= 3 select at; atList.Remove();
  • 26. XElement.RemoveAll实例4 XElement root = new XElement("Root", new XAttribute("Att1", 1), new XAttribute("Att2", 2), new XAttribute("Att3", 3), new XElement("Child1", 1), new XElement("Child2", 2), new XElement("Child3", 3) ); root.RemoveAll(); // removes children elements and attributes of root Console.WriteLine(root);
  • 27. Basic Queries (LINQ to XML)主题说明How to: Find an Element with a Specific Attribute演示如何查找特定的元素,该元素包含具有特定值的属性。How to: Find an Element with a Specific Child Element演示如何查找特定的元素,该元素包含具有特定值的子元素。Querying an XDocument vs. Querying an XElement解释针对根部位于 XElement 中的 XML 树编写查询与针对根部位于 XDocument 中的 XML 树编写查询有何差异。How to: Find Descendants with a Specific Element Name演示如何查找元素的具有特定名称的所有子代。该示例使用 Descendants 轴。How to: Find a Single Descendant Using the Descendants Method演示如何使用 Descendants 轴方法来查找单个具有唯一名称的元素。How to: Write Queries with Complex Filtering演示如何编写具有更复杂的筛选器的查询。How to: Filter on an Optional Element演示如何在形状不规则的树中查找节点。How to: Find All Nodes in a Namespace演示如何查找特定命名空间中的所有节点。How to: Sort Elements演示如何编写对查询结果进行排序的查询。How to: Sort Elements on Multiple Keys演示如何对多个键进行排序。How to: Calculate Intermediate Values演示如何使用 Let 子句在 LINQ to XML 查询中计算中间值。How to: Write a Query that Finds Elements Based on Context演示如何根据树中的其他元素来选择元素。How to: Debug Empty Query Results Sets显示在对针对默认命名空间中 XML 的查询进行调试时相应的修补程序。
  • 28. Advanced Query Techniques (LINQ to XML)主题说明How to: Join Two Collections (C#) (LINQ to XML)演示如何使用 Join 子句来利用 XML 数据中的关系。How to: Create Hierarchy Using Grouping演示如何将数据分组,再基于分组生成 XML。How to: Query LINQ to XML Using XPath演示如何基于 XPath 查询来检索集合。如何:编写 LINQ to XML 轴方法演示如何编写 LINQ to XML 轴方法。如何:执行文本到 XML 的流式转换演示如何在保持很小的内存需求量的同时将非常大的文本文件转换为 XML。How to: List All Nodes in a Tree演示一种用于列出 XML 树中所有节点的实用工具方法。此方法可用于调试修改 XML 树的代码。How to: Retrieve Paragraphs from an Office Open XML Document演示打开 Office Open XML 文档;检索 XElement 对象集合中的段落、段落文本和段落样式的代码。How to: Modify an Office Open XML Document演示打开、修改和保存 Office Open XML 文档的代码。How to: Populate an XML Tree from the File System演示从文件系统创建 XML 树的代码。
  • 29. 序列化 XML 树XElement 和 XDocument 类中的以下方法用于序列化 XML 树。可以将 XML 树序列化为文件、TextReader 或 XmlReader。ToString 方法序列化为字符串。 XElement.Save XDocument.Save XElement.ToString XDocument.ToString