- 浏览: 1488575 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (525)
- SEO (16)
- JAVA-EE-Hibernate (6)
- JAVA-EE-Struts (29)
- JAVA-EE-Spring (15)
- Linux (37)
- JAVA-SE (29)
- NetWork (1)
- CMS (14)
- Semantic Research (3)
- RIA-Flex (0)
- Ajax-Extjs (4)
- Ajax-Jquery (1)
- www.godaddy.com (0)
- SSH (34)
- JavaScript (6)
- SoftwareEngineer (9)
- CMMI (0)
- IDE-Myeclipse (3)
- PHP (1)
- Algorithm (3)
- C/C++ (18)
- Concept&Items (2)
- Useful WebSite (1)
- ApacheServer (2)
- CodeReading (1)
- Socket (2)
- UML (10)
- PowerDesigner (1)
- Repository (19)
- MySQL (3)
- SqlServer (0)
- Society (1)
- Tomcat (7)
- WebService (5)
- JBoss (1)
- FCKeditor (1)
- PS/DW/CD/FW (0)
- DesignPattern (11)
- WebSite_Security (1)
- WordPress (5)
- WebConstruction (3)
- XML|XSD (7)
- Android (0)
- Project-In-Action (9)
- DatabaseDesign (3)
- taglib (7)
- DIV+CSS (10)
- Silverlight (52)
- JSON (7)
- VC++ (8)
- C# (8)
- LINQ (1)
- WCF&SOA (5)
- .NET (20)
- SOA (1)
- Mashup (2)
- RegEx (6)
- Psychology (5)
- Stock (1)
- Google (2)
- Interview (4)
- HTML5 (1)
- Marketing (4)
- Vaadin (2)
- Agile (2)
- Apache-common (6)
- ANTLR (0)
- REST (1)
- HtmlAnalysis (18)
- csv-export (3)
- Nucth (3)
- Xpath (1)
- Velocity (6)
- ASP.NET (9)
- Product (2)
- CSS (1)
最新评论
-
lt26w:
理解成门面模式应该比较容易明白吧
FacadePattern-Java代码实例讲解 -
lt26w:
看下面的例子比较明白.
FacadePattern-Java代码实例讲解 -
javaloverkehui:
这也叫文档,别逗我行吗,也就自己看看。
HtmlCleaner API -
SE_XiaoFeng:
至少也应该写个注释吧。
HtmlCleaner API -
jfzshandong:
...
org.springframework.web.filter.CharacterEncodingFilter 配置
本章包括
n XML LINQ 查询轴方法
n 使用 XML LINQ 查询 XML 文档
n 转换 XML
10. 1 XML LINQ 轴方法
XML LINQ 提供了一些可以使用 LINQ 的轴方法。本章的目的就是介绍这些轴方法,然后将它们与查询操作符联合使用。开始之前,让我们先浏览一遍示例 XML 文件,列表 10.1 展示了书籍及其目录信息的 XML 文件内容。
列表 10.1 示例 XML 文件
<category name="Technical">
<category name=".NET">
<books>
<book>CLR via C#</book>
<book>Essential .NET</book>
</books>
</category>
<category name="Design">
<books>
<book>Refactoring</book>
<book>Domain Driven Design</book>
<book>Patterns of Enterprise Application Architecture</book>
</books>
</category>
<books>
<book>Extreme Programming Explained</book>
<book>Pragmatic Unit Testing with C#</book>
<book>Head First Design Patterns</book>
</books>
</category>
这个 XML 的层次很简单。它包含一个 parent <category> 元素,该元素又包含了一系列其它的子节点( <category> 元素或者 <books> 元素),这些子节点又有自己的子节点。使用 XML LINQ 轴方法,我们可以选择我们感兴趣的元素和属性。在继续之前,不得不强调一下,对于这些轴方法,上下文很重要。为了理解查询的结果,需要知道 XML 树中的当前位置。
现在我们需要轴方法的帮助,产生如下结果:
.NET
- CLR via C#
- Essential .NET
为了产生这种结果,需要先熟悉一下 Element, Attribute 和 Elements 的轴方法。
10.1. 1 Element
要产生以上结果,第一件要做的事就是选择 . NET category 元素。元素轴方法允许我们通过名称选择单个 XML 元素。如列表 10.2 所示:
列表 10.2 使用元素的轴方法选择一个元素
XElement root = XElement.Load("categorizedBooks.xml");
XElement dotNetCategory = root.Element("category");
Console.WriteLine(dotNetCategory);
需要阐明的一点是, Element 轴方法接受一个 XName 参数,并返回第一个匹配此 XName 的子元素。以上代码将会在控制台上输出以下内容:
<category name=".NET">
<books>
<book>CLR via C#</book>
<book>Essential .NET</book>
</books>
</category>
如果 Element 轴方法没有找到指定名称的元素,那么将返回一个 null 值。下面要做的就是获取 .NET category XElement 对象的 name 属性。
10.1. 2 Attribute
使用 Attribute 轴方法,可以获得 name 属性,跟 Element 轴方法一样, Attribute 也返回第一个匹配 XName 参数的属性,列表 10.3 显示了此轴方法的用法。
列表 10.3 使用 Attribute 获取一个 XML 元素上的属性
XElement root = XElement.Load("categorizedBooks.xml");
XElement dotNetCategory = root.Element("category");
XAttribute name = dotNetCategory.Attribute("name");
如果没有找到匹配的属性, Attribute 轴方法将会返回一个 null 。现在我们已经获得了 XAttribute 对象,可以通过将其转换为一个 string ,然后打印到控制台上,如下:
Console.WriteLine((string) name);
结果如下
.NET
接下来的工作,就是获取所有当前 catalog 元素包含的 book 内容。因为这是一个集合,所以我们需要使用 Elements 轴方法。
10.1. 3 Elements
Elements 方法和 Element 方法的主要区别是, Elements 方法返回所有匹配的元素。如你所料, Elements 方法返回一个 IEnumerable<XElement> 对象。列表 10.4 显示了如何使用 Elements 轴方法获取所有 .Net catalog 元素下 book 元素。
列表 10.4 使用 Elements 方法选择所有 book 字节点
XElement root = XElement.Load("categorizedBooks.xml");
XElement dotNetCategory = root.Element("category");
XAttribute name = dotNetCategory.Attribute("name");
XElement books = dotNetCategory.Element("books");
IEnumerable<XElement> bookElements = books.Elements("book");
Console.WriteLine((string) dotNetcategory);
foreach(XElement bookElement in bookElements)
{
Console.WriteLine(" - " + (string)bookElement);
}
运行以上代码,得到如下结果:
.NET
- CLR via C#
- Essential .NET
此外, Elements 方法还提供了一个无参数的重载,它会返回所有子节点。至此为止,我们已经实现了预定的目标。不过还有一些其它重要的轴方法也是我们应该学习的。
10.1. 4 Descendants
Descendants 轴方法与 Elements 方法类似,但是它只是在字节点中查找, Descendants 将会在所有的后代节点中查找。当你不确定要查找元素的层次的时候,使用 Descendants 方法非常有用。 Descendants 有一个接受 XName 的重载和一个无参数的重载,概念上跟 Elements 方法类似。还是使用 10.1 中 XML 数据,这次我们要获取所有的 book 元素,而不管它在哪个目录下。因为 book 元素在不同的层次下,所以我们不能使用 Elements 轴方法,使用 Descendants 方法可以很好的完成这个工作,如列表 10.5 所示:
列表 10.5 使用 Descendants 方法获取 book 元素
XElement books = XElement.Load("categorizedBooks.xml");
foreach(XElement bookElement in books.Descendants("book"))
{
Console.WriteLine((string)bookElement);
}
输出如下:
CLR via C# Essential .NET Refactoring
Domain Driven Design
Patterns of Enterprise Application Architecture
Extreme Programming
Explained Pragmatic Unit Testing with C#
Head First Design Patterns
还有一个 DescedantNodes 轴方法,它与 Descendants 方法类似。区别是, DescedantNodes 方法的返回结果还包含那些非元素节点(如 XComment 和 XProcessingInstruction )。它返回一个 IEnumerable< XNode > 对象,而不是 IEnumerable< XElement >.
注意到 Descendants 方法并不会把当前节点也包括在搜索上下文中。如果你希望搜索包含当前节点的功能,可以使用 DescendantsAndSelf 方法。再次返回 10.1 引入的 XML ,如下:
<category name="Technical">
<category name=".NET">
<books>
<book>CLR via C#</book>
<book>Essential .NET</book>
</books>
</category>
<category name="Design">
<books>
<book>Refactoring</book>
<book>Domain Driven Design</book>
<book>Patterns of Enterprise Application Architecture</book>
</books>
</category>
<books>
<book>Extreme Programming Explained</book>
<book>Pragmatic Unit Testing with C#</book>
<book>Head First Design Patterns</book>
</books>
</category>
列表 10.6 的代码比较了 Descendants 和 DescendantsAndSelf 方法。
列表 10.6 比较 Descendants 和 DescendantsAndSelf 方法
XElement root = XElement.Load("categorizedBooks.xml");
IEnumerable<XElement> categories = root.Descendants("category");
Console.WriteLine("Descendants");
foreach(XElement categoryElement in categories)
{
Console.WriteLine(" - " + (string)categoryElement.Attribute("name"));
}
categories = root.DescendantsAndSelf("category");
Console.WriteLine("DescendantsAndSelf");
foreach (XElement categoryElement in categories)
{
Console.WriteLine(" - " + (string)categoryElement.Attribute("name"));
}
结果如我们所料:
Descendants
- .NET
- Design
DescendantsAndSelf
- Technical
- .NET
- Design
因为 Elements 和 Descendants 返回 IEnumerable<XElement> 对象,所以我们可以使用 LINQ 标准操作符进行查询。如列表 10.7 所示:
列表 10.7 使用 LINQ 查询表达式查询 XML
XElement root = XElement.Load("categorizedBooks.xml");
var books = from book in root.Descendants("book")
select (string)book;
foreach(string book in books)
{
Console.WriteLine(book);
}
10.1. 5 Ancestor s
Ancestors 方法与 Descendants 方法非常相似,不过 Ancestors 是在 XML 树中向上查询。除此之外,它们有相同的参数和重载,还有一个相同的关联方法 AncestorNodes 。本节的示例中,我们要获取一个指定的 book 所属的所有 catalog 。因为 catalog 元素是嵌套的,所以我们要得到的 catalog 路径具有如下形式:
Domain Driven Design is in the: Technical/Design category.
首先选择我们需要的 book 元素。使用如下代码:
XElement root = XElement.Load("categorizedBooks.xml");
XElement dddBook =
root.Descendants("book")
.Where(book => (string)book == "Domain Driven Design")
.First();
最后完整的代码如列表 10.8 所示:
列表 10.8 使用 Ancestors
XElement root = XElement.Load("categorizedBooks.xml");
XElement dddBook = root.Descendants("book")
.Where(book => (string)book == "Domain Driven Design").First();
IEnumerable<XElement> ancestors = dddBook.Ancestors("category").Reverse();
string categoryPath = String.Join("/",
ancestors.Select(e => (string)e.Attribute("name")).ToArray());
Console.WriteLine((string)dddBook + " is in the: " + categoryPath + "category.");
结果如下:
Domain Driven Design is in the: Technical/Design category.
10 . 1 . 6 ElementsAfterSelf, NodesAfterSelf, ElementsBeforeSelf 和 NodesBeforeSelf
ElementsAfterSelf, ElementsBeforeSelf, NodesAfterSelf 和 NodesBeforeSelf 方法提供了一种获取位于当前元素之前或者之后所有元素的简单方法。从名字可以看出, ElementsBeforeSelf 和 ElementsAfterSelf 方法返回当前元素之前或者之后的所有 XElement 对象。不过,如果你需要获取所有节点而不只是元素,那么应该使用 NodesBeforeSelf 和 NodesAfterSelf 方法。需要注意的是, ElementsAfterSelf, ElementsBeforeSelf, NodesAfterSelf 和 NodesBeforeSelf 方法的选择范围只在当前节点的同级节点上。列表 10.9 显示了 ElementsBeforeSelf 的用法。
列表 10.9 使用 ElementsBeforeSelf 查找当前节点之前的所有同级节点
XElement root = XElement.Load("categorizedBooks.xml");
XElement dddBook =
root.Descendants("book")
.Where(book => (string)book == "Domain Driven Design")
.First();
IEnumerable<XElement> beforeSelf = dddBook.ElementsBeforeSelf();
foreach (XElement element in beforeSelf)
{
Console.WriteLine((string)element);
}
结果如下:
Refactoring
可以看见,查询局限于当前节点的同级节点之内。
10.1. 7 Visual Basic XML 轴属性
(请参阅原著)
10. 2 标准查询操作符
在下一节中,我们将会使用标准查询操作符和 XML LINQ 查找一些出色的 .NET 书籍。这些最受欢迎的前 20 本 .NET 书籍是从 Amazon.com 提供的 web 服务获得的。我们将会使用这些书籍数据讲解如何使用各种标准查询操作符查询 XML 。开始之前,需要我们学会如何从 Amazon.com 获取书籍数据。
Amazon 提供了用来访问各种数据的 web 服务。为了使用这些 web 服务,你需要使用它们的 web 服务程序注册 (http://www.amazon.com/gp/aws/registration/registration-form.html) 。注册以后,你就赋予了访问 Amazon web 服务的权限。 Amazon 的 web 服务提供了 SOAP 和 REST 两个版本。 本节,我们将通过 REST 接口访问 web 服务。可以使用下面的 URL 访问 REST 版本的 TagLookup 服务。
http://ecs.amazonaws.com/onca/xml?Service=AWSECommerceService
&AWSAccessKeyId={Your Access Key Here}
&Operation=TagLookup
&ResponseGroup=Tags,Small
margin: 0c
发表评论
-
WPF/Silverlight深度解决方案:(六)HLSL自定义渲染特效之完美攻略(上)
2010-01-13 16:40 2329Shader Effect 中文名称为“渲染特效”或“滤镜” ... -
Silverlight Image Source URI : 一个反斜杠引发的血案
2010-01-12 13:10 3540Silverlight Image Source U ... -
SilverLight跨域访问及其常用的几种解决方法
2010-01-06 16:59 5403SilverLight 出于对安全性的考虑默认情况下对UR ... -
有关silverlight中调用webservice的问题!!
2010-01-06 15:07 3247System.InvalidOperationExceptio ... -
Server.UrlEncode、HttpUtility.UrlDecode不同编码
2010-01-06 12:39 3207Server.UrlEncode、HttpUtility.U ... -
LINQ to XML一些基本查询
2010-01-06 12:34 2002/**/ /// /根据元素的名称进行筛选(有命名空 ... -
使用LINQ to XML来查询XML
2010-01-06 12:16 2721使用LINQ to XML来查询XML ... -
给弟弟起步学习软件开发(.Net 方向)的指导,博友们帮助看看,提些意见给他。
2010-01-06 11:15 923在我学习的时候走了至少3年的弯路,那个时候没有人告诉我该如 ... -
LINQ to XML 用 LINQ 查询 XML
2010-01-06 11:15 1480LINQ to XML 用 LINQ 查询 XML ... -
一个实例掌握linq to XML增查删改
2010-01-06 11:10 2220最近忽然想把过去写的I ... -
XML LINQ简介
2010-01-06 10:32 1512本章包括 n XML LINQ ... -
.Net 中string与byte[]相互转换
2010-01-05 16:43 2356public static byt ... -
正则表达式收集(持久更新)
2010-01-04 15:56 1075正则表达式收集( ... -
网上搜集的webbrower的资料,很有借鉴价值
2010-01-04 15:54 1868http://hi.baidu.com/lovemoe/ ... -
Lexware Assembly Reference Tool for Visual Studio 2005 / 2008
2010-01-04 10:35 1836http://www.codeproject.com/KB/m ... -
Visual Studio的 诡异bug(mscorlib无法引用)
2010-01-04 09:27 2470这个需要手动修改项目的配置文件 添加 <Re ... -
[C#实战]Google Map开发实战参考
2010-01-03 16:48 5738[C# 实战] ... -
复习一下 .Net: delegate(委托)、event(事件) 的基础知识,从头到尾实现事件!
2010-01-02 23:33 2534有这样一道 .Net/C# 面试题:请以事件的概念实现 ... -
ADO.NET Entity Framework简介
2009-12-21 18:46 2657下一代的ADO.NET的目标是要解决关系数据模型和实际应用程序 ...
相关推荐
亲测好用,利用c# 的LinqXML技术 将XML文件中的属性转换为元素
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
•SampleQueries: 这是最重要的示例,其中包含了 500 多个关于如何在 LINQ to Objects、LINQ to SQL、LINQ to XML 和 LINQ to DataSet 中使用各个查询运算符的例子。 •SimpleLambdas: 几个关于如何编写和使用 ...
/**/////使用 XPath 查询 LINQ to XML 23 修改XML树#region 修改XML树 23 /**/////将属性转换为元素 23 /**/////函数构造 24 /**/////向树中添加元素 24 //移除元素 25 /**/////维护名称/值对 26 /**/////元素名称/...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
第10章 使用LINQ to XML查询并转换XML 260 10.1 LINQ to XML轴方法 261 10.1.1 Element 262 10.1.2 Attribute 263 10.1.3 Elements 264 10.1.4 Descendants 264 10.1.5 Ancestors 267 10.1.6 ...
4.1 LINQ到XMl API简要说明 12 4.2 XML的创建 12 4.3 XML的输入输出 13 4.4 XML的遍历 14 4.5 XML的修改 14 4.6 XML的属性(Attribute) 15 4.7 XML的注释 15 4.8 XML事件 15 第5章 LINQ到XML操作符 16 5.1 ...
主要介绍了C#使用LINQ查询表达式的基本子句总结,在C#程序中我们可以使用LINQ基本查询表达式模式来查询和转换SQL数据库、ADO.NET数据集、XML文档和流以及.NET集合中的数据,需要的朋友可以参考下
主要实现读取xml文件内容然后转换成List对象,两种实现方法。
本文实例讲述了C#实现XML与实体类之间相互转换的方法。分享给大家供大家参考,具体如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System...
主要实现读取xml文件内容然后转换成List对象,两种实现方法。
全书共10章,分别介绍了XML基础语法、应用文档对象模型、用XSLT转换XML文档、利用DTD和XSDSchema验证XML文档、XML文档的读取、ADO.NET的相关知识、.NETFramework3.5后支持的新技术WCF和LINQ、XML在WCF中的应用以及...