LINQ to XML 概述

LINQ to XML 提供一个内存中 XML 编程接口,该接口利用 .NET Language-Integrated 查询 (LINQ) 框架。 LINQ to XML 使用 .NET 功能,与更新的重新设计的文档对象模型 (DOM) XML 编程接口相当。

XML 被广泛采用为许多上下文中的数据设置格式的方法。 例如,可以在 Web、配置文件、Microsoft Office Word 文件和数据库中查找 XML。

LINQ to XML 经过了重新设计,是最新的 XML 编程方法。 该系统在内存中提供文档对象模型(DOM)的文档修改功能,并支持 LINQ 查询表达式。 尽管这些查询表达式在语法上与 XPath 不同,但它们提供类似的功能。

LINQ to XML 开发人员

LINQ to XML 面向各种开发人员。 对于只想完成某些作的平均开发人员,LINQ to XML 通过提供类似于 SQL 的查询体验,使 XML 更加轻松。 只需进行一些研究,程序员就可以学会用所选编程语言编写简洁而强大的查询。

专业开发人员可以使用 LINQ to XML 大幅提高工作效率。 通过使用 LINQ to XML,他们可以编写出更少的代码,表达能力更强、更为紧凑、功能更强。 它们可以同时使用来自多个数据域的查询表达式。

LINQ to XML 是一个 XML 编程接口

LINQ to XML 是支持 LINQ 的内存中 XML 编程接口,可用于在 .NET 编程语言中使用 XML。

LINQ to XML 类似于文档对象模型(DOM),因为它会将 XML 文档引入内存中。 可以查询和修改文档,修改文档后,可以将其保存到文件或序列化它并通过 Internet 发送它。 但是,LINQ to XML 不同于 DOM:

  • 它提供一个新的对象模型,其重量更轻,更易于使用。
  • 它利用 C# 和 Visual Basic 中的语言功能。

LINQ to XML 的最重要优势是它与 Language-Integrated 查询(LINQ)的集成。 通过此集成,可以对内存中 XML 文档编写查询,以检索元素和属性的集合。 LINQ to XML 的查询功能与 XPath 和 XQuery 相当(尽管不是语法)。 C# 和 Visual Basic 中的 LINQ 集成提供更强大的键入、编译时检查和改进的调试器支持。

LINQ to XML 的另一个优点是能够将查询结果用作参数 XElement ,而 XAttribute 对象构造函数支持创建 XML 树的强大方法。 此方法称为 功能构造,使开发人员可以轻松地将 XML 树从一个形状转换为另一个形状。

例如,你可能具有典型的 XML 采购订单,如 示例 XML 文件中所述:典型采购订单。 通过使用 LINQ to XML,可以运行以下查询来获取采购订单中每个项元素的部件号属性值:

// Load the XML file from our project directory containing the purchase orders
var filename = "PurchaseOrder.xml";
var currentDirectory = Directory.GetCurrentDirectory();
var purchaseOrderFilepath = Path.Combine(currentDirectory, filename);

XElement purchaseOrder = XElement.Load(purchaseOrderFilepath);

IEnumerable<string> partNos =  from item in purchaseOrder.Descendants("Item")
                               select (string) item.Attribute("PartNumber");
' Load the XML file from our project directory containing the purchase orders
Dim filename = "PurchaseOrder.xml"
Dim currentDirectory = Directory.GetCurrentDirectory()
Dim purchaseOrderFilepath = Path.Combine(currentDirectory, filename)

Dim purchaseOrder As XElement = XElement.Load(purchaseOrderFilepath)

Dim partNos = _
    From item In purchaseOrder...<Item> _
    Select item.@PartNumber

在 C# 中,可以采用方法语法形式重写:

IEnumerable<string> partNos = purchaseOrder.Descendants("Item").Select(x => (string) x.Attribute("PartNumber"));

作为另一个示例,你可能希望按部分编号对值大于 $100 的项目进行排序的列表。 若要获取此信息,可以运行以下查询:

// Load the XML file from our project directory containing the purchase orders
var filename = "PurchaseOrder.xml";
var currentDirectory = Directory.GetCurrentDirectory();
var purchaseOrderFilepath = Path.Combine(currentDirectory, filename);

XElement purchaseOrder = XElement.Load(purchaseOrderFilepath);

IEnumerable<XElement> pricesByPartNos =  from item in purchaseOrder.Descendants("Item")
                                 where (int) item.Element("Quantity") * (decimal) item.Element("USPrice") > 100
                                 orderby (string)item.Element("PartNumber")
                                 select item;
' Load the XML file from our project directory containing the purchase orders
Dim filename = "PurchaseOrder.xml"
Dim currentDirectory = Directory.GetCurrentDirectory()
Dim purchaseOrderFilepath = Path.Combine(currentDirectory, filename)

Dim purchaseOrder As XElement = XElement.Load(purchaseOrderFilepath)

Dim partNos = _
From item In purchaseOrder...<Item> _
Where (item.<Quantity>.Value * _
       item.<USPrice>.Value) > 100 _
Order By item.<PartNumber>.Value _
Select item

同样,在 C# 中,可以采用方法语法形式重写:

IEnumerable<XElement> pricesByPartNos = purchaseOrder.Descendants("Item")
                                        .Where(item => (int)item.Element("Quantity") * (decimal)item.Element("USPrice") > 100)
                                        .OrderBy(order => order.Element("PartNumber"));

除了这些 LINQ 功能外,LINQ to XML 还提供改进的 XML 编程接口。 使用 LINQ to XML,可以:

  • 文件加载 XML。
  • 将 XML 序列化为文件或流。
  • 使用功能构造从头开始创建 XML。
  • 使用类似于 XPath 的轴查询 XML。
  • 使用AddRemoveReplaceWithSetValue等方法操作内存中的 XML 树。
  • 使用 XSD 验证 XML 树。
  • 使用这些功能的组合将 XML 树从一个形状转换为另一个形状。

创建 XML 树

使用 LINQ to XML 进行编程的最显著优势之一是可以轻松创建 XML 树。 例如,若要创建小型 XML 树,可以编写如下所示的代码:

XElement contacts =
new XElement("Contacts",
    new XElement("Contact",
        new XElement("Name", "Patrick Hines"),
        new XElement("Phone", "206-555-0144",
            new XAttribute("Type", "Home")),
        new XElement("phone", "425-555-0145",
            new XAttribute("Type", "Work")),
        new XElement("Address",
            new XElement("Street1", "123 Main St"),
            new XElement("City", "Mercer Island"),
            new XElement("State", "WA"),
            new XElement("Postal", "68042")
        )
    )
);
Dim contacts As XElement = _
    <Contacts>
        <Contact>
            <Name>Patrick Hines</Name>
            <Phone>206-555-0144</Phone>
            <Address>
                <Street1>123 Main St</Street1>
                <City>Mercer Island</City>
                <State>WA</State>
                <Postal>68042</Postal>
            </Address>
        </Contact>
    </Contacts>

注释

该示例的 Visual Basic 版本使用 XML 文本。 也可以在 Visual Basic 中使用 XElement ,如 C# 版本一样。

有关详细信息,请参阅 XML 树

另请参阅