- 浏览: 1525171 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (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 2367Shader Effect 中文名称为“渲染特效”或“滤镜” ... -
Silverlight Image Source URI : 一个反斜杠引发的血案
2010-01-12 13:10 3581Silverlight Image Source U ... -
SilverLight跨域访问及其常用的几种解决方法
2010-01-06 16:59 5430SilverLight 出于对安全性的考虑默认情况下对UR ... -
有关silverlight中调用webservice的问题!!
2010-01-06 15:07 3309System.InvalidOperationExceptio ... -
Server.UrlEncode、HttpUtility.UrlDecode不同编码
2010-01-06 12:39 3259Server.UrlEncode、HttpUtility.U ... -
LINQ to XML一些基本查询
2010-01-06 12:34 2035/**/ /// /根据元素的名称进行筛选(有命名空 ... -
使用LINQ to XML来查询XML
2010-01-06 12:16 2747使用LINQ to XML来查询XML ... -
给弟弟起步学习软件开发(.Net 方向)的指导,博友们帮助看看,提些意见给他。
2010-01-06 11:15 960在我学习的时候走了至少3年的弯路,那个时候没有人告诉我该如 ... -
LINQ to XML 用 LINQ 查询 XML
2010-01-06 11:15 1507LINQ to XML 用 LINQ 查询 XML ... -
一个实例掌握linq to XML增查删改
2010-01-06 11:10 2245最近忽然想把过去写的I ... -
XML LINQ简介
2010-01-06 10:32 1553本章包括 n XML LINQ ... -
.Net 中string与byte[]相互转换
2010-01-05 16:43 2422public static byt ... -
正则表达式收集(持久更新)
2010-01-04 15:56 1109正则表达式收集( ... -
网上搜集的webbrower的资料,很有借鉴价值
2010-01-04 15:54 1891http://hi.baidu.com/lovemoe/ ... -
Lexware Assembly Reference Tool for Visual Studio 2005 / 2008
2010-01-04 10:35 1878http://www.codeproject.com/KB/m ... -
Visual Studio的 诡异bug(mscorlib无法引用)
2010-01-04 09:27 2515这个需要手动修改项目的配置文件 添加 <Re ... -
[C#实战]Google Map开发实战参考
2010-01-03 16:48 5769[C# 实战] ... -
复习一下 .Net: delegate(委托)、event(事件) 的基础知识,从头到尾实现事件!
2010-01-02 23:33 2561有这样一道 .Net/C# 面试题:请以事件的概念实现 ... -
ADO.NET Entity Framework简介
2009-12-21 18:46 2689下一代的ADO.NET的目标是要解决关系数据模型和实际应用程序 ...
相关推荐
通过这些方法,你可以轻松地对XML数据进行查询、筛选、转换、添加、修改和删除等操作。在实际项目中,根据具体需求,还可以结合其他LINQ方法和表达式进行更复杂的操作。在QueryXMLByLINQ的示例代码中,你可能会看到...
此外,LINQ to XML还提供了许多其他高级功能,如转换XML到其他类型的数据结构(如List),以及反过来将数据结构转换为XML。例如,如果有一个`Student`类,我们可以轻松地将列表转换为XML: ```csharp public class ...
综上所述,System.Data.Linq.dll和System.Xml.Linq.dll是.NET开发中的重要工具,它们分别处理数据库交互和XML操作,通过使用LINQ查询语言,开发者可以更高效地编写代码并管理数据。学习和掌握这两个库的使用,对于...
接着,书籍会深入到LINQ to XML的细节,讲解如何创建、修改和查询XML文档。LINQ to XML引入了XElement和XAttribute类,用以表示XML元素和属性,使得操作XML就像操作.NET集合一样简单。此外,还会涉及XPath和XQuery的...
2. **查询操作**:LInq To Xml支持查询表达式,通过`.Where()`, `.Select()`, `.OrderBy()`等方法,可以对XML元素进行筛选、转换和排序。例如,`from element in doc.Descendants("child") where (string)element....
在实际项目中,根据具体的XML结构和需求,可以灵活组合使用这些方法来实现各种复杂的查询和计算。在提供的示例文件"SumElement"中,很可能是包含了实际的XML数据和相应的计算逻辑,可以参考这个文件来深入了解和实践...
5. **LINQ操作**:可以使用各种LINQ操作符(如Where、Select、OrderBy等)对XML元素进行过滤、转换和排序。 教程中虽然制作较为粗糙,但作为学习LINQ的基础教材,它能帮助开发者快速理解并掌握这两种技术。通过实际...
在这个场景中,我们将探讨如何使用C#的LINQ to XML来将XML文件中的属性转换为元素。 首先,让我们了解XML的基本结构。XML是一种标记语言,用于存储和传输数据。数据以元素的形式存在,元素可以有子元素、文本内容和...
通过使用LINQ,开发者可以用更简洁的代码来检索、筛选和转换XML数据。例如,使用`.Elements()`、`.Descendants()`和`.Attributes()`方法可以轻松地遍历XML树,而`.Where()`、`.Select()`等扩展方法则可以实现复杂的...
3. **LINQ方法链**:通过方法链,可以方便地进行XML文档的创建、修改和查询。例如,`doc.Root.Element("child").Value` 可以获取根元素下的第一个子元素的值。 4. **延迟执行**:LINQ查询不会立即执行,而是等到...
LINQ to XML 的查询功能非常强大,它支持XPath和CSS选择器的查询方式,但更推荐使用Linq表达式。例如,我们可以使用`.Descendants()`或`.Elements()`查找子元素,使用`.Attribute()`获取属性值: ```csharp var ...
与传统的DOM(文档对象模型)和XPath或XQuery相比,LINQ to XML提供了更高效的API来创建、修改和查询XML文档。 ** 创建XML文档 ** 使用LINQ to XML,可以轻松地创建XML文档。例如,通过`XElement`和`XAttribute`类...
Linq to XML的类库包括`XDocument`、`XElement`、`XAttribute`等,它们提供了创建、修改和查询XML的强大工具。 接下来,我们讨论如何找到XML文档的根元素。在Linq to XML中,`XDocument`类表示一个完整的XML文档,...
掌握LINQ查询表达式和查询运算符,能帮助开发者写出更简洁、更强大的代码,同时减少了与各种数据源交互时的复杂性。无论是处理内存中的数据结构,还是与数据库、XML或其他数据源交互,LINQ都能提供一致的编程模型,...
3. **查询XML**:LINQ to XML支持Linq的查询语法,如`Where()`、`Select()`、`OrderBy()`等,这使得查找、过滤、转换XML数据变得简单。例如,查询所有"Child1"元素: ```csharp var childElements = from e in doc...
同时,.NET Framework 2.0(包含在VS2003中)引入了LINQ to XML(Language Integrated Query for XML),这是一种更直观的方式来处理XML文档,可以方便地创建、查询和修改XML。 4. **.NET中的数据绑定**: 在.NET...
`XDocument`类提供了更现代且易于使用的API来处理XML,而LINQ则简化了数据查询和转换的过程。 1. 加载XML文件:使用`XDocument.Load()`方法加载XML文件。 2. 使用LINQ查询:通过LINQ查询XML元素,然后映射到T类型...
在这个场景下,"winform 使用XSLT来转换XML源码"是指在WinForm应用中利用XSLT(Extensible Stylesheet Language Transformations)技术对XML文档进行转换。 XSLT是一种强大的语言,专门设计用于将XML数据转换成其他...
在与数据库交互时,LINQ使用的是LINQ to SQL或Entity Framework等ORM(对象关系映射)框架,将SQL查询语句转换为面向对象的代码。 LINQ的基本语法包括查询表达式和方法语法。查询表达式以简洁的、类似SQL的形式...