65.9K
CodeProject 正在变化。 阅读更多。
Home

LINQ to XSD

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (10投票s)

2008年11月6日

CPOL

3分钟阅读

viewsIcon

103126

downloadIcon

1723

如何通过 XSD 和 XML 使用 LINQ。

LinqToXSD_Demo

引言

本文介绍如何使用 LinqXML 以及 XSD 文件。
使用 Linq to XSD 的目的是通过拥有更多功能、强类型字段等来增强 Linq to XML

本文提供了一种通过新的 Linq To XSD 技术使用 XML 数据库的方法。
它没有列举所有可能性、所有错误情况……,而只是向读者提供了开始工作所需的知识。

背景

在阅读本文之前,您必须具备 LINQ、XML 和 XSD 的一些基础知识。如果您不熟悉这些技术,请参考以下链接

另一个 LINQ to Something

该技术可用于管理 XML 数据库。

我开始搜索LINQ To XML 的信息,以处理我的 XML 数据库之外的查询。但我不太喜欢查询的语法,因为它非常模糊并且不是强类型的。最终代码不可读,对于初学者来说可能难以理解。我一直在寻找一些非常简单易用的东西。

事实上,我想编写最简单的代码(还有什么?),并且毫不费力地管理我的数据!LINQ to XSD 为我们做到了这一点!所以你只需要钱、姑娘和威士忌 ;-)

先决条件和警告

在创建新项目之前,您需要安装 LINQ To XSD alpha 2 Refresh 在您的计算机上。 它是一个 alpha 软件,所以请小心安装。

数据库

要使用 Linq To XSD,您必须有一个 XSD 文件,该文件描述并验证您的 XML 数据库架构。
在压缩的示例文件中,您将找到一个 *Database* 目录,其中包含一个 XML 数据库及其相关的 XSD 架构文件。

XSD 文件

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            targetNamespace="urn:books"
            xmlns:bks="urn:books">

  <xsd:element name="books" type="bks:BooksForm"/>

  <xsd:complexType name="BooksForm">
    <xsd:sequence>
      <xsd:element name="book"
                  type="bks:BookForm"
                  minOccurs="0"
                  maxOccurs="unbounded"/>
      </xsd:sequence>
  </xsd:complexType>

  <xsd:complexType name="BookForm">
    <xsd:sequence>
      <xsd:element name="author"   type="xsd:string"/>
      <xsd:element name="title"    type="xsd:string"/>
      <xsd:element name="genre"    type="xsd:string"/>
      <xsd:element name="price"    type="xsd:float" />
      <xsd:element name="pub_date" type="xsd:date" />
      <xsd:element name="review"   type="xsd:string"/>
    </xsd:sequence>
    <xsd:attribute name="id"   type="xsd:string"/>
  </xsd:complexType>
</xsd:schema>

XML 数据库文件

<?xml version="1.0"?>
<x:books xmlns:x="urn:books">
   <book id="bk001">
      <author>Robert E. Howard</author>
      <title>The Coming of Conan the Cimmerian</title>
      <genre>Science Fiction & Fantasy</genre>
      <price>44.95</price>
      <pub_date>2003-12-02</pub_date>
      <review>Conan let go, spat blood from his mouth..</review>
   </book>

   <book id="bk002">
      <author>Terry Goodkind</author>
      <title>Wizard's First Rule</title>
      <genre>Fantasy</genre>
      <price>24.95</price>
      <pub_date>2001-06-23</pub_date>
      <review>My world contest best book</review>
   </book>

   <book id="bk003">
      <author>HP Lovecraft</author>
      <title>Call of Cthulhu</title>
      <genre>Science Fiction & Fantasy</genre>
      <price>42</price>
      <review>I am writing this under an appreciable mental strain, 
		since by tonight I shall be no more...</review>
   </book>
</x:books>

创建新项目

安装 Linq To XSD 后,只需打开 Visual Studio 2008 并创建一个新的 Linq to XSD 项目。

Create project

然后将 XSD 文件添加到项目中(可以创建一个新的,也可以导入一个现有的)。

Add XSD file

最后,只需更改 XSD 文件的构建选项。 从解决方案资源管理器打开 XSD 文件属性,并将生成操作更改为 LinqToXSDSchema

Build action

只需构建您的项目,现在您就可以使用 Linq 和另一个 XML 文件了!!太棒了!!

打开 XML 数据库

注意:如果您在 XSD 文件中指定了命名空间,那么相同的命名空间可以从 C# 中获得,包括所有类!
在示例 XSD/XML 文件中,我使用了命名空间 urn::books::

urn.books.books m_books_database = urn.books.books.Load("books.xml");

查询

然后,您可以直接在 LINQ 查询中使用 m_books_database 对象

//retrieve the books list
var list_books = from c in m_books_database.book
                 select c;

现在,list_books 包含 XML 文件中的完整书籍列表。 因此,您可以通过使用 foreach 或将其发送到可数据绑定的控件等来管理数据。

另一个具有特定输出值的查询(Title (Author) : Price

var list_books_title = 	from c in m_books_database.book
			select c.title + " (" + c.author + ") Price:" + 
			c.price.ToString() + "$";
listBox1.DataSource = list_books_title.ToList();

修改 XML 数据

要使用 Linq 修改 XML 属性,您只需要查询任何对象,修改其属性,最后 save 数据库。

//query the book identified by bk001
var book001 = from c in m_books_database.book
	      where c.id.CompareTo("bk001")==0
	      select c;

//remember that book001 is an IEnumarable, so you must check existence of first element
book001.First().price = 1234;

//save database (here a new file to see differences between files)
m_books_database.Save("books2.xml");

删除和创建元素

删除一本书

要删除一个 XML 元素,只需查询该对象并调用数据库实例的 Remove 方法。

//select the book  bk001
var book001 = from c in m_books_database.book
	      where c.id.CompareTo("bk001")==0
	      select c;

//remove it
foreach (var b in book001)
	m_books_database.book.Remove(b);

创建一本新书

要创建一个新的 XML 元素,只需创建一个本地对象并将此项添加到数据库实例。

//create the book instance
urn.books.BookForm itemToAdd = new urn.books.BookForm();
itemToAdd.author = "Andrew Troelsen";
itemToAdd.genre="Programming";
itemToAdd.id="bk004";
itemToAdd.price=37.79f;
itemToAdd.pub_date=Convert.ToDateTime("2007-12-07");
itemToAdd.title = "Pro C# 2008 and the .NET 3.5 Platform";

//add it to database
m_books_database.book.Add(itemToAdd);

强类型和智能感知

Linq To XSD(与 Linq To XML 相比)的主要优点之一是对象是强类型的,因此可以直接被智能感知使用。
因此,它提供了一种非常好的方式来提高生产力并避免运行时错误。 (由于对象是真正类型的,因此构建会检测到错误)。

Intellisense

关注点

  • 易于使用
  • 需要的代码更少,所以错误更少...
  • 快速实现
  • 优于 Linq To XML
  • 完全集成在智能感知中
  • 代码可读

剩余要点

  • Linq to XSD 是“Preview alpha”
  • 在大 XML 文件上的查询速度是否足够快?

参考文献

历史

  • 2008 年 11 月 4 日:初始版本
© . All rights reserved.