LINQ to XSD






4.75/5 (10投票s)
如何通过 XSD 和 XML 使用 LINQ。

引言
本文介绍如何使用 Linq 和 XML 以及 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 项目。

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

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

只需构建您的项目,现在您就可以使用 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 相比)的主要优点之一是对象是强类型的,因此可以直接被智能感知使用。
因此,它提供了一种非常好的方式来提高生产力并避免运行时错误。 (由于对象是真正类型的,因此构建会检测到错误)。

关注点
- 易于使用
- 需要的代码更少,所以错误更少...
- 快速实现
- 优于 Linq To XML
- 完全集成在智能感知中
- 代码可读
剩余要点
- Linq to XSD 是“Preview alpha”
- 在大 XML 文件上的查询速度是否足够快?
参考文献
历史
- 2008 年 11 月 4 日:初始版本