.Net又引入了LINQ,于是LINQ to XML也就应运而生,所以在.Net中,不仅可以用W3C XML DOM标准,还可以使用LINQ to XML来操作XML文档。下面就来简单介绍一下如何使用LINQ to XML
LINQ to XML是.NET框架中用于处理XML文档的一种强大且高效的方法。它是Language Integrated Query (LINQ)技术的一部分,允许开发者使用类似SQL的查询语法来操作XML数据。与传统的W3C XML DOM标准相比,LINQ to XML提供了更简洁、更直观的API,简化了XML的读取、创建和修改过程。
### 1. 加载XML文档
在LINQ to XML中,有三种主要的方式加载XML文档:
- `XDocument.Load(string uri)`:通过文件路径加载XML文档。
- `XDocument.Load(Stream stream)`:从流对象(如内存流或网络流)加载XML内容。
- `XDocument.Parse(string text)`:解析XML字符串内容并创建`XDocument`对象。
例如:
```csharp
// 从文件加载
XDocument doc1 = XDocument.Load("XMLFile1.xml");
// 从内存流加载
byte[] fileContent = ...; // 获取文件内容
MemoryStream ms = new MemoryStream(fileContent);
XDocument xDoc = XDocument.Load(ms);
// 从字符串解析
string xmlString = @"<xml>...</xml>";
XDocument doc2 = XDocument.Parse(xmlString);
```
### 2. 查询XML数据
查询是LINQ to XML的核心功能,它使用Linq查询表达式(query expressions)或者方法链(method chaining)来检索XML数据。
#### 2.1 查询示例
考虑以下XML文档:
```xml
<?xml version="1.0" encoding="utf-8"?>
<Customers>
<Customer id="01" city="Beijing" country="China">Lenovo
<Order OrderID="1001" Freight="36.00" />
<Order OrderID="1003" Freight="61.50" />
</Customer>
<!-- ... -->
</Customers>
```
- **返回所有`Customer`节点**:
```csharp
var result = from customer in doc.Descendants("Customer")
select customer.Value;
foreach (var s in result)
{
Console.WriteLine(s);
}
```
这将打印出所有`Customer`元素的文本值。
- **返回id为02且city为Amsterdam的`Customer`**:
```csharp
var result = (from customer in doc.Descendants("Customer")
where (string)customer.Attribute("id") == "02" &&
(string)customer.Attribute("city") == "Amsterdam"
select customer);
foreach (var customer in result)
{
Console.WriteLine(customer.Value);
}
```
这个查询将找到匹配条件的`Customer`元素,并输出其文本值。
#### 2.2 方法链查询
使用方法链可以编写更紧凑的查询:
```csharp
var customers = doc.Descendants("Customer")
.Where(c => (string)c.Attribute("id") == "02" &&
(string)c.Attribute("city") == "Amsterdam");
foreach (var c in customers)
{
Console.WriteLine(c.Value);
}
```
效果与上面的查询表达式相同。
### 3. 创建和修改XML
创建新的XML文档或修改现有文档同样方便。例如,添加一个新的`Customer`元素:
```csharp
XElement newCustomer = new XElement("Customer",
new XAttribute("id", "03"),
new XAttribute("city", "Shanghai"),
new XAttribute("country", "China"),
"Huawei");
doc.Root.Add(newCustomer);
```
这会在`Customers`根元素下添加一个新`Customer`元素。
### 4. 与其他数据源结合
LINQ to XML的一个强大特性是它可以与其他数据源(如数据库、集合、数组等)进行交互。这使得在XML数据和关系数据之间建立连接变得容易。
例如,将数据库查询结果转换为XML:
```csharp
var dbResult = from p in context.Products
where p.Price > 100
select p;
XDocument productsXml = new XDocument(
new XElement("Products",
from product in dbResult
select new XElement("Product",
new XElement("Name", product.Name),
new XElement("Price", product.Price)
)
)
);
```
这样就将数据库查询的结果转换成了一个XML文档。
### 总结
LINQ to XML提供了简洁、高效的API,使得在.NET环境中处理XML数据变得更加便捷。它的查询能力、创建和修改XML的功能,以及与其他数据源的集成,使得XML编程更加直观和强大。在实际开发中,根据项目需求,开发者可以灵活选择DOM、LINQ to XML或其他XML处理技术来优化代码性能和可读性。