LINQtoXML:简化XML操作的利器
立即解锁
发布时间: 2025-08-21 00:06:09 阅读量: 2 订阅数: 8 


C#编程基础与实战技巧
### LINQ to XML:简化XML操作的利器
#### 1. 引言
可扩展标记语言(XML)是存储和交换数据的重要方法。LINQ为语言增添了特性,使得处理XML比XPath和XSLT等先前方法更加容易。LINQ to XML在多个方面简化了XML的创建、遍历和操作,例如:
- 可以通过单条语句以自上而下的方式创建XML树。
- 无需XML文档来包含树,即可在内存中创建和操作XML。
- 无需文本子节点,即可创建和操作字符串节点。
#### 2. 标记语言
标记语言是放置在文档中的一组标签,用于提供关于文档中信息的信息。标记标签不是文档的数据,而是包含关于数据的数据,即元数据。HTML是最广为人知的标记语言,其标签中的元数据包含有关网页在浏览器中应如何呈现以及如何使用超文本链接在页面之间导航的信息。与大多数标记语言包含预定义的标签集不同,XML仅包含少数定义的标签,其余标签由程序员定义,以表示特定文档类型所需的任何类型的元数据。只要数据的编写者和读者就标签的含义达成一致,标签就可以包含设计者想要的任何有用信息。
#### 3. XML基础
XML文档中的数据包含在XML树中,该树主要由一组嵌套元素组成。元素是XML树的基本组成部分,每个元素都有一个名称,并且可以包含数据,有些元素还可以包含其他嵌套元素。元素由开始标签和结束标签分隔,元素包含的任何数据都必须位于其开始标签和结束标签之间。
- 开始标签以左尖括号开头,后跟元素名称,可选地后跟任何属性,最后以右尖括号结尾,例如 `<PhoneNumber>`。
- 结束标签以左尖括号开头,后跟斜杠字符,再后跟元素名称,最后以右尖括号结尾,例如 `</PhoneNumber>`。
- 没有内容的元素可以用单个标签表示,该标签以左尖括号开头,后跟元素名称,再后跟斜杠,最后以右尖括号结尾,例如 `<PhoneNumber />`。
以下是一个XML片段示例:
```xml
<EmployeeName>Sally Jones</EmployeeName>
<PhoneNumber />
```
关于XML的其他重要注意事项包括:
- XML文档必须有一个包含所有其他元素的单个根元素。
- XML标签必须正确嵌套。
- 与HTML标签不同,XML标签区分大小写。
- XML属性是包含有关元素的额外元数据的名称/值对,属性的值部分必须始终用引号括起来,可以是双引号或单引号。
- XML文档中的空白会被保留,这与HTML不同,HTML中输出的空白会合并为单个空格。
下面是一个包含两名员工信息的XML文档示例:
```xml
<Employees>
<Employee>
<Name>Bob Smith</Name>
<PhoneNumber>408-555-1000</PhoneNumber>
<CellPhone />
</Employee>
<Employee>
<Name>Sally Jones</Name>
<PhoneNumber>415-555-2000</PhoneNumber>
<PhoneNumber>415-555-2001</PhoneNumber>
</Employee>
</Employees>
```
#### 4. XML类
LINQ to XML可以通过两种方式处理XML。第一种方式是作为简化的XML操作API,第二种方式是使用LINQ查询功能。LINQ to XML API由许多表示XML树组件的类组成,其中最重要的三个类是XElement、XAttribute和XDocument。
- XDocument节点可以有以下直接子节点:
- 最多每个以下节点类型各一个:XDeclaration节点、XDocumentType节点和XElement节点。
- 任意数量的XProcessingInstruction节点。
- 如果XDocument下有顶级XElement节点,它就是XML树中其余元素的根。
- 根元素又可以包含任意数量的嵌套XElement、XComment或XProcessingInstruction节点,嵌套到任意级别。
除了XAttribute类,用于创建XML树的大多数类都派生自一个名为XNode的类,在文献中通常统称为“XNodes”。
#### 5. 创建、保存、加载和显示XML文档
以下代码展示了如何创建、保存、加载和显示XML文档:
```csharp
using System;
using System.Xml.Linq;
class Program {
static void Main() {
XDocument employees1 =
new XDocument(
new XElement("Employees",
new XElement("Name", "Bob Smith"),
new XElement("Name", "Sally Jones")
)
);
employees1.Save("EmployeesFile.xml");
XDocument employees2 = XDocument.Load("EmployeesFile.xml");
Console.WriteLine(employees2);
}
}
```
输出结果:
```xml
<Employees>
<Name>Bob Smith</Name>
<Name>Sally Jones</Name>
</Employees>
```
#### 6. 创建XML树
可以使用XDocument和XElement的构造函数在内存中创建XML文档。构造函数的第一个参数是对象的名称,第二个及后续参数包含XML树的节点。以下代码示例展示了如何创建一个包含员工信息的XML树并显示它:
```csharp
using System;
using System.Xml.Linq;
class Program {
static void Main() {
XDocument employeeDoc =
new XDocument(
new XElement("Employees",
new XElement("Employee",
new XElement("Name", "Bob Smith"),
new XElement("PhoneNumber", "408-555-1000")
),
new XElement("Employee",
new XElement("Name", "Sally Jones"),
new XElement("PhoneNumber", "415-555-2000"),
new XElement("PhoneNumber", "415-555-2001")
)
)
);
Console.WriteLine(employeeDoc);
}
}
```
输出结果:
```xml
<Employees>
<Employee>
<Name>Bob Smith</Name>
<PhoneNumber>408-555-1000</PhoneNumber>
</Employee>
<Employee>
<Name>Sally Jones</Name>
<PhoneNumber>415-555-2000</PhoneNumber>
<PhoneNumber>415-555-2001</PhoneNumber>
</Employee>
</Employees>
```
#### 7. 使用XML树中的值
遍历XML树并检索或修改值时,XML的强大功能就会显现出来。以下是用于检索数据的主要方法:
| 方法名称 | 类 | 返回类型 | 描述 |
| --- | --- | --- | --- |
| Nodes | Xdocument, XElement | IEnumerable<object> | 返回当前节点的所有子节点,无论其类型如何 |
| Elements | Xdocument, XElement | IEnumerable<XElement> | 返回当前节点的所有XElement子节点或具有特定名称的所有子节点 |
| Element | Xdocument, XElement | XElement | 返回当前节点的第一个XElement子节点或具有特定名称的第一个子节点 |
| Descendants | XElement | IEnumerable<XElement> | 返回所有后代XElement节点或具有特定名称的所有后代XElement节点,无论其在当前节点下的嵌套级别如何 |
| DescendantsAndSelf | XElement | IEnumerable<XElement> | 与Descendants相同,但也包括当前节点 |
| Ancestors | XElement | IEnumerable<XElement> | 返回所有祖先XElement节点或当前节点上方具有特定名称的所有祖先XElement节点 |
| AncestorsAndSelf | XElement | IEnumerable<XElement> | 与Ancestors相同,但也包括当前节点 |
| Parent | XElement | XElement | 返回当前节点的父节点 |
以下是一些关于这些方法的重要注意事项:
- Nodes:Nodes方法返回一个IEnumerable<object>类型的对象,因为返回的节点可能是不同类型的,例如XElement、XComment等。可以使用类型参数化方法OfType<type>来指定要返回的节点类型,例如 `IEnumerable<XComment> comments = xd.No
0
0
复制全文
相关推荐








