基于Visual Studio2010讲解C#4.0语法(2)--使用XQuery引擎操作XML文档

本文介绍如何利用XQuery和LINQ to XML查询XML文件中的数据,通过具体示例展示了查询共同作者的书籍的方法。

目前,市面上的XML数据库,尤其是源生XML数据库(Native XML Database)如Ipedo XML Database、Software AG Tamino Server、Berkeley XML Database都提供了XQuery支持,用于查询存储在XML数据库中的XML片断或者XML节点。甚至Ipedo XML数据库还提供了XQuery Update功能,用于更新XML文档内容。下图是这类XQuery引擎的例示图。


这类XQuery引擎内嵌在XML数据库中,实现方面需要考虑内部存储的特性,如使用的数据结构、存储的XML Meta信息等。在查询优化方面需要考虑索引(Index)的使用,使用不使用索引以及使用哪一个索引。

下面我们来看下这方面的实例:

首先打开Visual Studio2010创建一个基于C#的ConsoleApplication工程XQuery:

创建成功进入工程后,首先我们在工程项目下创建一个Data文件夹向其中添加一个bib.xml文件如下图所示:

然后打开bib.xml加入下列代码:

<bib> <book year="1994"> <title>TCP/IP Illustrated</title> <author> <last>Stevens</last> <first>W.</first> </author> <publisher>Addison-Wesley</publisher> <price>65.95</price> </book> <book year="1992"> <title>Advanced Programming in the Unix environment</title> <author> <last>Stevens</last> <first>W.</first> </author> <publisher>Addison-Wesley</publisher> <price>65.95</price> </book> <book year="2000"> <title>Data on the Web</title> <author> <last>Abiteboul</last> <first>Serge</first> </author> <author> <last>Buneman</last> <first>Peter</first> </author> <author> <last>Suciu</last> <first>Dan</first> </author> <publisher>Morgan Kaufmann Publishers</publisher> <price>39.95</price> </book> <book year="1999"> <title>The Economics of Technology and Content for Digital TV</title> <editor> <last>Gerbarg</last> <first>Darcy</first> <affiliation>CITI</affiliation> </editor> <publisher>Kluwer Academic Publishers</publisher> <price>129.95</price> </book> </bib>

最后在Program.cs文件里写入如下代码:

using System; using System.Collections.Generic; using System.IO; using System.Xml; using System.Linq; using System.Xml.Linq; namespace LinqToXmlSample { class Program { static void Main(string [] args) { //列出所有Serge and Peter共同撰写的书籍 XDocument doc = XDocument.Load(SetDataPath() + "bib.xml"); var b1 = doc.Descendants("book") .Where(b => b.Elements("author") .Elements("first") .Any(f => (string)f == "Serge")); var b2 = doc.Descendants("book") .Where(b => b.Elements("author") .Elements("first") .Any(f => (string)f == "Peter")); var books = b1.Concat(b2); foreach (var q in books) Console.WriteLine(q); Console.ReadLine(); } static public string SetDataPath() { string path = Environment.CommandLine; while (path.StartsWith("\"")) { path = path.Substring(1, path.Length - 2); } while (path.EndsWith("\"") || path.EndsWith(" ")) { path = path.Substring(0, path.Length - 2); } path = Path.GetDirectoryName(path); return Path.Combine(path, "data\\"); } } }

按下F5开始调试,运行界面如下:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值