返回首页

{A}目录{A5}{A6}{A7}{A8}{A9}{A10}{A11}{A12}{A13}{A14}{A15}{A16}{A17}{A18}{A19}{A20}{A21}
NET 3.0现在已经被释放,所以我们应该都知道,现在我们不应该。哎呀,它似乎并不像很久以前。NET 2.0中走过来的。对于那些不实现,NET 3.0中实际上包含了很多新的东西很多,如:的Windows Workflow Foundation(WWF)的管理对象生命周期/持久化对象存储Windows通信基础(WCF):新的通信层的Windows Presentation Foundation(WPF):新的presenstation层(XAML)Windows CardSpace的:它提供了一个基于标准的解决方案的工作和管理不同的数字标识
所以你可以看到有一个有很多教训。我在学习WPF / WCF的过程中,但我也有兴趣在一个叫做LINQ的一个小宝石,我相信将会NET 3.5和Visual Studio"Orcas"中的一部分(其现在已知)。 LINQ将增加新的功能,C#和VB.NET。 LINQ的有三种口味:LINQ的内存中的对象:语言集成查询(LINQ到对象2007年3月逆戟鲸CTP改名)DINQ:为数据库语言集成查询(改名为2007年3月逆戟鲸CTP的LINQ to SQL)XLINQ:为XML语言集成查询(LINQ to XML的2007年3月逆戟鲸CTP改名)
LINQ的是很酷,而且我一直在寻找后期,所以我想,我会写在希望一篇文章我的LINQ / DLINQ / XLINQ地区的经验,它可能只是帮助一些你良好的民俗。本文将重点对XLINQ,是一系列的三篇文章中的第三。
系列文章的内容如下:{A22}:将所有有关标准的LINQ,这是用来查询在内存中的数据对象,比如List,数组等等{A23}:将使用DLINQ,这是LINQ对数据库中的数据 第3部分(本文):将使用XLINQ,这是LINQ对XML数据{A24}
在我开始轰击人们更多的信息比他们可能可以处理之前,让我简要谈谈本文所附的文件。
本文包含两个单独的zip文件。 zip文件有两个演示应用程序。演示应用程序1
是基于使用Visual Studio 2005与。NET 2.0框架,并在2006年5月LINQ CTP可用{A25}
{S0}
看到,XML语法高亮?这一切都归功于自由和梦幻般的的火球代码高亮,代码项目提供的权利,在{A26}。
主窗口允许用户尝试各种XLINQ活动,如:创建一个新的XML树节创建一个新的XML文档打开一个现有的XML文档查找根节点属性查询本系列中的XML使用标准的LINQ查询} {A27描述运营商更新XML节删除XML节
在这第一个演示应用程序的第二个表(可从"Web查询"菜单),使用XLINQ从Flickr中获取一个RSS feed,使用一个Flickr API字符串。你不应该需要下载任何东西,这个额外的工作,因为它是所有的代码。 Flickr的RSS提要,然后查询使用XLINQ(这是什么LINQ是一回事,语言集成查询语言,记不清了),结果被放到了一个新的结构,使用标准的LINQ投影,然后的结果,然后用来填充一个PictureBox控件FlowLayoutPanel的代表收集到的图像。用户还可以自由改变所取得的成果通过Flickr搜索的类型,并有可能页。
演示应用程序2
{A28}和Visual Studio 2005的组合,或写字板使用Visual Studio 2005中,如果你喜欢写的东西是基于。
很明显,因为它的WPF,你也将需要的,和2006年5月LINQ CTP可用{A25}。这个想法,是那些希望看到WPF / XAML将如何使用LINQ的民间可以在这个项目中有一个。不要担心,如果你不得到这个代码,应用程序,因为这将是我的下一篇文章的题目。真的被包括利息,在这一点上,以示LINQ和WPF可以工作很好地结合起来。
{S2}
{S3}
{S4}的
这是基本上做同样的事情作为示范应用1第二形式,它只是看起来一个整体要好很多,并展示了一些很酷的WPF的东西像:动画数据绑定模板样式资源XLINQ的用法,当然
此应用程序是不是真的,为导向,以XLINQ,但它的东西,我只是想尝试,所以我想,我已经做到了,在这里上为什么不包括。正如我说,如果你不演示应用程序2,不用担心,我将通过它在另一篇文章。这里为利益的缘故。
完整的文章,这也说明这个WPF应用程序可以找到{A30}要运行本文附带的代码你将需要安装的5月2006年的LINQ的CTP这是可用{A25},一个新的年3月2007年CTP版可用,但有关完整安装4GB(它不只是LINQ的,但在整个下一代的Visual Studio代号为"Orcas"中),相当繁琐的,并且可能会改变,无论如何,所以2006年5月LINQ CTP将被确定为本文试图证明什么的目的。演示应用程序1,使用优秀的火球代码高亮,代码项目提供的权利,在{A26}。演示应用程序,使得使用。NET 3.0框架,这是可供下载{A34}{A35}
,所以这XLINQ的东西是什么?那么,它的风味LINQ(语言集成查询)。NET 3.5中的一部分,并肯定会的下一个版本的Visual Studio(目前称为Orcas的)的一部分。
回顾一下,记得,LINQ处理例如数组和列表和字典的对象,而DLINQ或通过SQL的LINQ实体和数据库的交互处理内存中的对象。因此,任何猜测XLINQ的是?那么,它实际上是对LINQ的XML。
那么还有什么我们可以说这XLINQ的东西呢?我们会要求微软自己的营销Blurb的是,尽可能XLINQ而言。我问他们,和他们说这:
"XLINQ是发展从一开始就记在XML语言集成查询。利用标准查询运算符,并添加特定于XML的查询扩展,从XML的角度XLINQ提供XQuery和XPath查询和改造电源融入。NET Framework语言实现的LINQ模式(例如,C#,VB等),这提供了跨越启用LINQ的API的一个一致的查询经验和让您与来自其他数据源的查询的XML查询和转换结合起来。更深入地去XLINQ的查询功能,在第3节,"与XLINQ查询XML"。
语言集成查询功能的XLINQ一样显著的事实,即XLINQ代表了一个新的,现代化的内存中的XML编程API。 XLINQ被设计为一个更清洁,现代化的API,以及快速的和轻量级的。 XLINQ使用各种创新的现代语言特性(例如,泛型和可空类型)和DOM编程模型上有些分歧,以简化对XML编程。即使没有语言集成查询功能XLINQ代表一个XML编程显著迈进。本文件的下一节,"XML编程",提供对内存中的XML编程API XLINQ方面更多的细节。"
(摘自XLINQ overview.doc,在LINQ项目[1]网站)
我觉得这是一个相当XLINQ是什么很好的说明,并承诺要。当然,它应该是一个良好的销售Blurb的,XLINQ是微软的发明。但是,这一切意味着平均发展呢?
这是东西,本文将尝试和示范,通过使用文本注释和代码片断和现实生活中工作的例子。
除非另有说明,在本文的示例代码所示,将仅供讨论。不过不用担心,我的路我走了,实际上拖网XLINQ文档和一个不错的演示应用程序,包含如何使用XLINQ做一些最常用的XML相关的现实生活中的工作的例子,任务。所以这方面的工作代码包含在演示应用程序1,和我专门使用的演示应用程序代码1,我将显示下面的图像,让你知道,你可以在一个工作示例代码看起来。
{五},当你看到这个图片,这意味着我已经创建了一个为你工作,例如在演示应用程序1。
很明显,我没有得到的每一个单一的东西,可以用XLINQ做的例子,因为我有自己的生活(并不多,但尽管如此)。因此,我将不得不离开作为读者的excercise进一步调查。
,本文构造的方式是通过以下的项目,我会考虑是非常重要的问题,与XML工程的每一个开发人员应该知道。XLINQ类结构创建新的XML保存XML载入XML遍历XML根节点工作追加新要素更新现有的元素删除现有元素查询XML 使用XLINQ访问第三方XML数据
我希望通过这个项目,截至去年底,读者将有至少与XLINQ什么可以做的基本升值,以及如何使用DOM和XPath它可以用来就地。
所以,我们应继续吗?{A36}
整体XLINQ类heirachy如下所示。
{中六}虽然XElement的是在类的层次低,这是在XLINQ根本类。一般XML树的XElements树。 XAttributes是一个XElement的名称/值对。 XDocuments创建只有必要的,如持有DTD或顶层的XML处理指令(XProcessingInstruction)。所有其他XNodes只能叶节点的下一个XElement,或者可能是一个XDocument(如果它们存在在根级别)。的XAttribute和XNode是对等的,而不是从一个共同的基类派生的(不是对象除外)。这反映了一个事实,XML属性真正的名字与XML元素没有在XML树中的节点关联的值对。与W3C DOM的对比。XText暴露在这个版本的XLINQ,但如上所述,最好是把它看作一个半隐藏实现细节,除了揭露文本节点时是必要的。作为一个用户,您可以取回在作为一个字符串值或其他简单的元素或属性的文本值。 唯一可以有孩子的XNode是一个XContainer,这意味着无论一个XDocument或XElement的。一个XDocument可以包含一个XElement(根元素),XDeclaration,XDocumentType,或XProcessingInstruction。一个XElement可以包含另一个XElement的,一个XComment,一个XProcessingInstruction,和文本(可通过多种格式,但将作为文本的XML树表示)。
XLINQ overview.doc,在LINQ项目[1]网站。{A37}
为了undestand如何XLINQ是从现有的XML文档的创建pratices不同,让我们考虑以下部分传统的DOM(文档对象模型)代码,创建一个小的XML文档。

XmlDocument doc = new XmlDocument();

XmlElement name = doc.CreateElement("name");

name.InnerText = "Patrick Hines";

XmlElement phone1 = doc.CreateElement("phone");

phone1.SetAttribute("type", "home");

phone1.InnerText = "206-555-0144";        

XmlElement phone2 = doc.CreateElement("phone");

phone2.SetAttribute("type", "work");

phone2.InnerText = "425-555-0145";        

XmlElement street1 = doc.CreateElement("street1");        

street1.InnerText = "123 Main St";

XmlElement city = doc.CreateElement("city");

city.InnerText = "Mercer Island";

XmlElement state = doc.CreateElement("state");

state.InnerText = "WA";

XmlElement postal = doc.CreateElement("postal");

postal.InnerText = "68042";

XmlElement address = doc.CreateElement("address");

address.AppendChild(street1);

address.AppendChild(city);

address.AppendChild(state);

address.AppendChild(postal);

XmlElement contact = doc.CreateElement("contact");

contact.AppendChild(name);

contact.AppendChild(phone1);

contact.AppendChild(phone2);

contact.AppendChild(address);

XmlElement contacts = doc.CreateElement("contacts");

contacts.AppendChild(contact);

doc.AppendChild(contacts);


虽然这是相当容易的事,什么是不很清楚的是排放到实际的XML文档的结构。工作,这个简单的例子,它是可能的,但如果这是一个大的XML文档,它不会那么清晰。 XLINQ如何做相同的工作,我们一看?{C}
首先要说的是,这是少了很多代码,树的结构几乎是从该房产不言自明的 - 和它几乎一样容易读为一个XML文档。其他需要注意的一点是,在实际的语法本身,没有在任何地方,我们看到的方法createElement(),或appendChild()函数。相反,我们看到了新的XElement,排序使得更有意义,至少在如何实际读取。我个人认为,谁知道XML,但尚未使用的DOM前的人可能会理解这种新语法的好一点,因为它似乎是在实际使用的术语更匹配。一个XML的人都知道,作为一个新的元素的新元素,而不是appendChild()函数。我猜测,这到底是真的偏好。
{五} 1,演示应用程序包含三个菜单为了进一步说明这个概念,看看:编程的LINQ \创建元素的菜单编程的LINQ \创建整个文档"菜单编程的LINQ \创建带有命名空间菜单的元素
双方的XDocument和XElement暴露一个重载的Save()方法,选项如下:
XDocument.Save(字符串文件名)
这个选项只保存XElements内容由filename参数而指定的位置。
XDocument.Save(System.Xml.XmlWriter作家)
这个选项只是XElements内容保存到XmlWriter
XDocument.Save(TextWriter的TextWriter的)
这个选项只是XElements内容保存到一个TextWriter的
XDocument.Save(文件名字符串,BOOL preserveWhitespace)
这个选项只保存XElements内容由filename参数而指定的位置,并保留任何空白。
同样的方法存在的XElement{A39}
双方的XDocument和XElement暴露了一个重载的Load()方法,选项如下:
XDocument.Load(URI字符串)
这个选项简单地加载XML元素由URI指定的位置进入了一个新的XDocument
XDocument.Save(System.Xml.XmlReader读者)
这个选项只是读入一个新的XDocument一个XmlReader的内容
XDocument.Save(TextReader的TextReader的)
这个选项只是读入一个新的XDocument一个TextReader的内容
XDocument.Save(URI文件名,BOOL preserveWhitespace)
这个选项只是读取filename参数而指定的文件的内容,并保存到一个新的XDocument任何空白,
也有另一种可能性加载XML。我们可以调用的XDocument.Parse方法解析一个字符串,所以让我们看看,我们的一个例子?
XElement contacts = XElement.Parse(

    @"<contacts>

        <contact>

            <name>Patrick Hines</name>

            <phone type=""home"">206-555-0144</phone>

            <phone type=""work"">425-555-0145</phone>

            <address>

                <street1>123 Main St</street1>

                <city>Mercer Island</city>            

                <state>WA</state>

                <postal>68042</postal>

            </address>

            <netWorth>10</netWorth>

        </contact>

    </contacts>");

一旦我们加载或解析一个字符串,可用于XLINQ全功率。我们可以遍历节点,检查属性,创建新的内容,删除现有的内容。
同样的方法存在的XElement
{五} 1,演示应用程序包含2个方面,为了进一步说明这个概念,看看:编程的LINQ \ Opem现有的文件菜单(这表明Load()方法)看看createQuerySource()方法(这表明的parse()方法){A40}
XLINQ提供一个XElement儿童的方法。要获得一个XElement或XDocument的所有儿童,可以使用nodes()方法。
例如,如果我们有下面的XML
{S9}
并运行下面的遍历
我们实际上结束了原始的XML。
那么如何获得子元素?那么,它的语法非常simliar逸岸。让我们看一个例子,我们呢?
foreach (XElement c in contacts.Elements("contact").Elements("address")) 

{

....

}


如果我们使用一个XDocument,返回IEnumerablelt; objectgt;因为你可以有文字与其他XLINQ类型,如XDeclaration,XComment,混合和XProcessingInstruction以及作为XElement的
我们如何处理这个,我们的foreach(XElement的在....是要失败的非XElement的情况下我们怎么做,很简单地说,我们做以下。
foreach (XElement c in contactsDoc.Nodes().OfType<XElement>()) 

{

....

}


{五} 1,演示应用程序包含三个菜单为了进一步说明这个概念,看看:遍历\显示所有菜单(这表明所有的元素)遍历\显示"菜单中的元素(只显示XElement的类型)遍历\"显示的子元素菜单(这表明接触单元的地址子元素){A41}
假设,我们有以下的XML结构:
<!--XLinq Contacts XML Example-->

<?MyApp 123-44-4444?>

<contacts numContacts="1">

  <contact>

    <name>sacha barber</name>

    <phone type="home">01273 45426</phone>

    <phone type="work">01903 205557</phone>

    <address>

      <street1>palmeira square</street1>

      <city>brighton</city>

      <county>east sussex</county>

      <postcode>BN3 2FA</postcode>

    </address>

  </contact>

</contacts>


我们希望与根节点的属性。我们通常会(如果使用DOM)需要获得一个文档节点的引用,然后用它来获得属性vales。 XLINQ没有的东西有点不同。
XElement root = contactsDoc.Root;

sb.Append(

    "Examining root element [" + root.Name + "] for attributes\r\n\r\n");

if (root.HasAttributes)

{

    foreach (XAttribute xa in root.Attributes())

    {

        sb.Append(

           "Found Attibute [" + xa.Name.ToString() + "] Value=" +  xa.Value);

    }

}

txtResults.Document.Text = sb.ToString();


这是足以让根节点的属性。这是假设前面的XML结构已被加载到一个XDocument称为contactsDoc。从结果可以看出,此演示应用程序1的屏幕截图。
{S11}
{五} 1,演示应用程序包含1菜单,进一步展示了这一概念,看看:编程的LINQ \获取根节点的属性值"菜单(这显示了如何获取根节点属性) {A42}
追加新的内容与XLINQ是相当琐碎。这是所有关于您要添加新的内容,一个特定的XDocument或XElement的参考。在这之后的工作是相当容易的。让我们看一个例子,我们呢?
这个例子假设有一个既存的XDocument所谓contactsDoc。
//obtain the root

XElement root = contactsDoc.Root;

//add new contact

root.Add(new XElement("contact",

                new XElement("name", "melissa george"),

                new XElement("phone", "01273 999999",

                    new XAttribute("type", "office")),

                new XElement("phone", "01903 888888",

                    new XAttribute("type", "work")),

                new XElement("address",

                    new XElement("street1", "churchill square"),

                    new XElement("city", "brighton"),

                    new XElement("county", "east sussex"),

                    new XElement("postcode", "BN3 4RG")

                    )

                )

            );

这一个位的代码创建了一个新接触的XElement,然后附加到现有的XDocument contactsDoc称为根元素。这是所有你所要做的的,你想将内容添加到对象,并添加内容使用add()方法
{五} 1,演示应用程序包含1菜单,进一步展示了这一概念,看看:编程的LINQ \追加新的联系人菜单(这显示了如何添加一个新的联系当前的XDocument的根元素){A43}
更新现有的内容,任何与XML会在某个阶段需要做的事情。这可能包括整个元素内容的更新,或者可以只是简单地更新一个现有元素的子元素。因为我太好了,我会都向您展示。
假设我们有以下的XML源,我们将更新。
{S14}更新整个元素
的情况下,我们要以新的内容更新整个元素,像以前一样,我们只是得到我们要申请更换内容,对象,并使用ReplaceContent()方法来取代它。
//obtain a single contact

IEnumerable<XElement> singleContact = (from c in contactsDoc.Root.Elements(

                                      "contact")

                                      where  ((string) c.Element(

                                      "name")).Equals("sarah dudee")

                                      select c);

//update contact, should only be 1

foreach (XElement xe in singleContact)

{

    //use the ReplaceContent method to do the replacement

        xe.ReplaceContent(new XElement("name", "sam weasel"),

            new XElement("phone", "01273 111111",

                new XAttribute("type", "office")),

            new XElement("phone", "01903 33333",

                new XAttribute("type", "work")),

            new XElement("address",

                new XElement("street1", "the drive"),

                new XElement("city", "brighton"),

                new XElement("county", "east sussex"),

                new XElement("postcode", "BN3 4RG")

            )

        );

}

这是足以取代整个接触单元,现有联系的元素,"莎拉dudee"的名称取代
{五} 1,演示应用程序包含1菜单,进一步展示了这一概念,看看:编程的LINQ \更新整个接触元素菜单(这显示如何更新当前的XDocument整个联系元素)仅更新子元素
的情况下,我们只希望以新的内容更新现有元素的一部分,像以前一样,我们只是得到我们要申请更换内容,对象,但这个时候,我们必须直接操纵元素的数据。
//obtain the firstContact

IEnumerable<XElement> firstContact = (  from c in contactsDoc.Root.Elements(

                                        "contact")



                                        select c).Take(1);

//update contact, should only be 1

foreach (XElement xe in firstContact)

{

    //UPDATE METHOD 1

    xe.Element("address").SetElement("city", "MANCHESTER");

    //UPDATE METHOD 2

    xe.Element("address").Element("postcode").ReplaceContent("MN1");

}

这是足以取代的联系元素的子元素。
{五} 1,演示应用程序包含1菜单,进一步展示了这一概念,看看:
编程的LINQ \更新只有1联络资料菜单(这显示了如何更新一个退出当前的XDocument元素的子元素){A44}
删除现有内容的东西,任何与XML会在某个阶段需要做的,也要去。
假设我们有以下XML源,我们将删除:
因此,像以前一样,我们只是获得对象,我们要删除,然后删除它使用Remove()方法。
//obtain the firstContact

IEnumerable<XElement> firstContact = (  from c in contactsDoc.Root.Elements(

                                        "contact")



                                        select c).Take(1);

//update contact, should only be 1

foreach (XElement xe in firstContact)

{

    xe.Element("address").Element("county").Remove();

}


这是足够的,删除现有的第一接触元件被删除(请记住,我们可以使用任何标准的LINQ查询运算符,所以我只是以(1)给我们的第一接触元件,整个接触元素)
{五} 1,演示应用程序包含1菜单,进一步展示了这一概念,看看:编程的LINQ \删除联系人"菜单(这显示了如何删除当前的XDocument整个接触元素){A45}
记得{A27}我介绍LINQ标准查询运算,以及猜测什么,XLINQ使用那些相同的标准查询运算符允许程序员查询XML树,以拉出操纵树的某些部分。如XPath允许。
在这里,唯一的限制是多么好您的标准查询运算符技能。因此,让我们看到一些例子,我们应吗?我已经有了四个小例子。
下面的查询在同一基地内演示应用程序中的第1 createQuerySource()方法创建的XML,这是所有工作的基础。获得第一联系查询
XElement contactsElements = createQuerySource();



XElement res = new XElement("contacts",

    (from c in contactsElements.Elements("contact")

    select new XElement("contact",

        c.Element("name"),

        new XElement("phoneNumbers", c.Elements("phone"))

    )).Take(1)

);

获取所有的电话号码查询
XElement contactsElements = createQuerySource();



foreach (XElement phone in contactsElements.Elements("contact").Elements(

    "phone"))

{

   //do something with the phone XElement

}

获取特定客户查询
XElement contactsElements = createQuerySource();

....

....

//look for this Element with the correct name requested

IEnumerable<XElement> cont = (from c in contactsElements.Elements("contact")

                             where  (string) c.Element("name") == userName

                             select c);

....

....

获取只有客户的家庭电话号码查询
XElement contactsElements = createQuerySource();

....

....

//look for this Element with the correct name requested

IEnumerable<XElement> res = (from c in contactsElements.Elements("contact")

                                 where  (string) c.Element(

                                 "phone").Attribute("type") == "home"

                                 select c);

....

....


{五} 1,演示应用程序包含4个菜单为了进一步说明这个概念,看看:查询\第一联系人菜单(获取第一接触单元)查询\获取电话号码菜单(元素的所有联系的电话号码)查询\获取客户的具体菜单(提示用户联系人姓名,并得到与该名称的联系,如果它存在)查询\获取客户家庭电话号码菜单(获取所有联系人的家庭电话号码属性){A47}
所以我们如何XLINQ抢一个RSS源的一些数据显示一些图像呢?毕竟,它应该能够应付任何XML数据,即使它不是本地的。我决定使用Flickr的数据源,因为我知道它有一个可用于获取RSS源与图像的URL的API。图片相当漂亮,而且也适用于显示在Windows窗体应用程序。这个概念的基础上的东西,我看到奥马尔Zabirs梦幻般的文章,这是可用{A48}
所以我们在看代码,这?类图如下:
{S20}
可以看出是一种形式,有一些按钮就可以了(btnGo / btnPrev / btnNext)和一个ComboBox(cmbSearchType)用于创建正确parametized RSS来自Flickr的饲料要求。 Flickr的请求是由RSSImageFeed类,它返回一个IEnumerablelt; PhotoInfogt;对象,表示当前的RSS提要请求的照片。
真的所有有给它。
现在一些代码。说实话这是非常简单的。FlickrRSSGrabber
using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Query;

using System.Xml.XLinq;

using System.Data.DLinq;



namespace Linq_3

{

    public partial class FlickrRSSGrabber : Form

    {

        private RSSImageFeed RSSImages = new RSSImageFeed();



        public FlickrRSSGrabber()

        {

            InitializeComponent();

        }

        private void btnGo_Click(object sender, EventArgs e)

        {

            RSSImages.PageIndex = 0;

            doFlickrSearch();

        }

        private void doFlickrSearch()

        {

            string searchType = cmbSearchType.SelectedItem.ToString();

            string searchWord = searchType.Equals(

                "By Search Word") ? this.txtSearchWord.Text : "";

            if (searchType.Equals("By Search Word") && string.IsNullOrEmpty(

                searchWord))

            {

                MessageBox.Show(

                    "You MUST enter a search word, to search by keyword");

         }

            else

            {

                getFlickrData(searchType, searchWord);

            }

        }

        private void getFlickrData(string searchType, string searchWord)

        {

            IEnumerable<PhotoInfo> photos = (

                IEnumerable<PhotoInfo>)RSSImages.LoadPictures(

                searchType, searchWord);

            if (photos.Count() > 0)

            {

                lblPageIngex.Visible = true;

                int pIndex = RSSImages.PageIndex;

                lblPageIngex.Text = "Page " + (++pIndex);

                //show the images, clearing old ones 1st

                pnlFlowPhotos.Controls.Clear();

                foreach (PhotoInfo pi in photos)

                {

                    PictureBox pb = new PictureBox();

                    pb.ImageLocation = @pi.PhotoUrl(true);

                    pb.SizeMode = PictureBoxSizeMode.AutoSize;

                    toolTip1.SetToolTip(pb, pi.Title);

                    pnlFlowPhotos.Controls.Add(pb);

                }

                setNextPrevStates(RSSImages.IsPrevAvail, 

                    RSSImages.IsNextAvail);

            }

            else

            {

                lblPageIngex.Visible = false;

                setNextPrevStates(false, false);

            }

        }

        private void setNextPrevStates(bool prevEnabled, bool nextEnabled)

        {

            btnPrev.Enabled = prevEnabled;

            string prevTT = btnPrev.Enabled ? "Click to go back a page" : 

                "There are no more pages";

            toolTip1.SetToolTip(btnPrev, prevTT);



            btnNext.Enabled = nextEnabled;

            string nextTT = btnNext.Enabled ? "Click to go forward a page" :

                "There are no more pages";

            toolTip1.SetToolTip(btnNext, nextTT);            

        }

        private void cmbSearchType_SelectedValueChanged(object sender, 

            EventArgs e)

        {

            string searchType = cmbSearchType.SelectedItem.ToString();

            txtSearchWord.Visible = searchType.Equals(

                "By Search Word") ? true : false;

            lblSearchWord.Visible = txtSearchWord.Visible;

        }

        private void btnNext_Click(object sender, EventArgs e)

        {

            RSSImages.PageIndex++;

            doFlickrSearch();

        }

        private void btnPrev_Click(object sender, EventArgs e)

        {

            RSSImages.PageIndex--;

            doFlickrSearch();

        }

        private void FlickrRSSGrabber_Shown(object sender, EventArgs e)

        {

            cmbSearchType.SelectedItem = "Most Recent";



            //getData from Flickr

            getFlickrData("MOST_RECENT", "");

        }

    }

}

RSSImageFeed
要了解这个类如何使用XLINQ获得Flickr数据,首先需要理解原始XML数据的Flickr提供的。由此可以看出,有三种可能的URL下面列出,:MOST_RECENT有趣的ENTER_TAG
这三个不同的网址之一触发值,用户从内FlickrRSSGrabber类中的组合框,上面显示(cmbSearchType)挑选。
所以让我们来看看一个小的Flickr让我们为这些请求之一子集。让我们MOST_RECENT网址
我们最终像这样的。尝试在FireFox自己,或者你喜欢的浏览器。
<rsp stat="ok">

<photos page="1" pages="10" perpage="100" total="1000">

<photo id="493415381" owner="8201860@N03" secret="dba0cae590" server="225" 

    farm="1" title="setting up 6" ispublic="1" isfriend="0" isfamily="0"/>

<photo id="493415375" owner="42802631@N00" secret="596a13de8e" server="226" 

    farm="1" title="DSC01713" ispublic="1" isfriend="0" isfamily="0"/>

<photo id="493392504" owner="59616645@N00" secret="49459bb023" server="191" 

    farm="1" title="IMG_0841" ispublic="1" isfriend="0" isfamily="0"/>

<photo id="493392488" owner="28532182@N00" secret="ebcdc8d2d8" server="220" 

    farm="1" title="img_1438" ispublic="1" isfriend="0" isfamily="0"/>


在这个结构来看,它很容易看到如何XLINQ语法(完整的代码如下所示的上市)的小位。
//select the RSS data from Flickr, and use standard LINQ projection

//to store it within a new PhotoInfo which is an object of my own making

IEnumerable<PhotoInfo> photos = (from photo in xroot.Element(

    "photos").Elements("photo")

    select new PhotoInfo

    { 

        Id = (string)photo.Attribute("id"),

        Owner = (string)photo.Attribute("owner"),

        Title = (string)photo.Attribute("title"),

        Secret = (string)photo.Attribute("secret"),

        Server = (string)photo.Attribute("server"),

        Farm = (string)photo.Attribute("Farm"),

    }).Skip(pageIndex * columns * rows).Take(columns * rows);


有几乎直接映射在这里,它很容易阅读。比较反复的过程,人会做,如果使用DOM,或比较其等效的XPath。我个人而言,我更喜欢在迭代DOM的过程中一周的任何一天的XPath,XPath的过程,但我更喜欢XLINQ过程。实在太容易阅读。
无论如何,对于那些想整个画面完整的代码清单。PhotoInfo
using System;

using System.Collections.Generic;

using System.Text;



namespace Linq_3

{

    public class PhotoInfo

    {

        private const string FLICKR_SERVER_URL = "http://static.flickr.com/";

        private const string FLICKR_PHOTO_URL = 

            "http://www.flickr.com/photos/";

        public string Id;

        public string Owner;

        public string Title;

        public string Secret;

        public string Server;

        public string Farm;

        public bool IsPublic;

        public bool IsFriend;

        public bool IsFamily;

        public string PhotoUrl(bool small)

        {

            return FLICKR_SERVER_URL + this.Server + '/' + 

                this.Id + '_' + this.Secret + (small ? "_s.jpg" : "_m.jpg");

        }

        public string PhotoPageUrl

        {

            get { return FLICKR_PHOTO_URL + this.Owner + '/' + this.Id; }

        }

    }

}


这三个类一起,所以把我们能拿出一点点的Flickr查看器,允许用户搜索最新/有趣的关键词或,并允许用户通过搜索结果页,如果有超过1页面价值的照片。尼斯吧?

正如原先说我也包括本XLINQ实验WPF版本,仅仅是因为我也学习WPF,我认为它看上去很酷。有些人可能也想看到WPF如何可以与XML数据绑定,因为这WPF应用程序的情况下。就像我刚才所说的,如果你没有得到WPF版本,不用担心,这将是另一篇文章的重点。
{S2}{A52}
我希望有一些你已经阅读{A27}和本系列文章,并可以看到所有的LINQ的不同口味之间的相似性。
我也希望这篇文章表明,XLINQ(LINQ对XML,因为它会在未来)是不那么可怕,其实很简单,使用,即使使用RSS和第三方XML数据源。
作为这个系列的截止注意,我只是想告诉人们,我没有多少知识有关LINQ当我开始,我只是得到我的头,并为它去。有些是有点沮丧,但说实话,我设法让所有的演示应用程序做我想要的东西(不是WPF一个,那就是一个不同的故事)内的某一天,这是一项新技术相当好,我认为。所以说(或认为)你会,有关LINQ,我认为这是从根本上改变的方法,使我们工作在各个层面的数据。它可能是,你会选择只使用LINQ,或只XLINQ或所有的LINQ提供。我知道,我可能会尝试在某个阶段在实时系统中的所有三个。跑马临清。{A54}
我只是想问问,如果你喜欢的文章,请为它投票,并留下一些意见,因为它让我知道如果文章在合适的水平或不的,以及是否包含哪些人需要知道了。{A55}
我已经很享受建设这篇文章,并已相当多么容易XLINQ是实际使用刷新。事实上,我想我不得不这样做XLINQ条第一,正如我最近完成了一个短期合同,我们正在做大量的XML解析,这本来与XLINQ容易得多。我也觉得在XLINQ,其中XML数据更新的方式是远远优于传统方法,它只是似乎更合乎逻辑的,其在XLINQ方式。没有更多的迭代过程,太棒了。{A56}
V1.0 10/05/07:首次发行 {A57}{A58}{A59}{A60}{A61}

回答

评论会员:游客 时间:2011/12/14
|myterminal:你有没有多少这篇文章不仅知道的XLINQ帮助的想法,但也找到了新的(可能是最好的)的方式来处理XML的这结束我的追求,找到最好的,最简单的方式在我的程序中使用XML的处理。非常感谢。{S23}
萨沙理发
评论会员:游客 时间:2011/12/14
呀XLINQ岩石萨沙理发微软的VisualC#MVP2008年2011CodeprojectMVP2008-2011Open源码{A62}你最好的朋友就是你。我是我最好的朋友。我们有着共同的看法,并未落认为我的博客:{A63}
Ashish古普塔ML
评论会员:这是如此的帮助 时间:2011/12/14
!Ashish古普塔ML
评论会员:游客 时间:2011/12/14
您的文章是非常有帮助
!swayson
评论会员:游客 时间:2011/12/14
非常有用!|丹尼豪普特曼
感谢,感谢
:它可以帮助我非常
评论会员:!萨沙理发 时间:2011/12/14
我认为每个人都普遍认同,这是一个优秀的文章
写得很好(在我看来)

最近我一直在使用它作为一个快速参考,因为它有助于流下了新的领域光,我曾与
困难 LINQ是一个伟大的新工具,并希望看到它在未来,但仍有遗留的应用程序需要一个XML和"正常"的数据库调用

恭喜,并期待着看到你带来什么光明未来

{S24}
评论会员:GChannon 时间:2011/12/14
完全同意你说的。我认为它可以更好,如果通过使用聪明的扩展方法是使用XmlReader等​​等等等,这使得它更容易阅读。

萨沙理发
微软的Visual C#MVP 2008/2009Codeproject MVP 2008/2009Your最好的朋友就是你。
我是我最好的朋友。我们有着共同的看法,并未落认为

我的博客:{A63}
评论会员:GChannon 时间:2011/12/14
嗨,

大文章!创建XML文档使用的XDocument和包装在SOAP包装
NBSP,我想知道你的意见;
我有这样的代码构建一个XML文档,但我想,建立在LINQ身体和序列化到SOAP包装。此外,XElement的不似乎让双冒号注解元素的名称

有兴趣的看看你的想法


感谢
LT codegt; 字符串SCMD = @"放大器; LT;?XML版本=""1.0"编码="UTF -16""放大器; GT";
SCMD = @"放大器; LT; ENV:信封的xmlns :ENV =""http://schemas.xmlsoap.org/soap/envelope/"放大器; GT";
- ; SCMD = @"放大器; LT; ENV:Bodyamp; GT;放大器; LT; D​​IS:登录的xmlns:DIS =""http://www.sap.com/SBO/DIS"放大器; GT; "
SCMD ="放大器; LT; D​​atabaseServeramp; GT;放大器; LT / DatabaseServeramp; GT;
SCMD ="放大器; LT; D​​atabaseNameamp; GT;放大器; LT / DatabaseNameamp; GT;";
SCMD ="放大器; LT; D​​atabaseTypeamp; GT;放大器; LT / DatabaseTypeamp; GT"; { BR} - ; SCMD ="放大器; LT; D​​atabaseUsernameamp; GT; saamp; LT / DatabaseUsernameamp; GT"; {BR } SCMD ="放大器; LT; D​​atabasePasswordamp; GT;7安培; LT / DatabasePasswordamp; GT";
- ; SCMD ="放大器; LT; CompanyUsernameamp; GT;放大器; LT / CompanyUsernameamp; GT";
NBSP - ; SCMD ="放大器; LT; CompanyPasswordamp; GT;放大器; LT / CompanyPasswordamp; GT";
- ; SCMD ="放大器; LT; Languageamp; GT; ln_Englishamp; LT / Languageamp; GT";
NBSP - ; SCMD ="放大器; LT; LicenseServeramp; GT;:30000安培; LT / LicenseServeramp; GT;";
NBSP - ; SCMD ="放大器;
评论会员:萨沙理发 时间:2011/12/14
公共静态类的消息
{
& #160; / / /公升; summarygt;
  ;/ / /添加XElement的SOAP信封
/ / /
/ / /公升; returnsgt;返回XML文档作为stringlt; / returnsgt; & #160; 静态字符串(XElement的内容)
 0; {
/ / SOAP命名空间
& #160; XNamespace ENV ="htt​​p://schemas.xmlsoap.org/soap/envelope/";

/ / SOAP信封
 0; 的XDocument的SOAPMessage =新的XDocument(
 0; 新XDeclaration("1.0","UTF - 16","无"),
& #160; 新的XElement(ENV"信封",
 60; 新的XAttribute(XNamespace.Xmlns"环境保护","http://schemas.xmlsoap.org/soap/envelope/"),
 0; 新的XElement(ENV"体",
内容))
&# 160; )

  ; 返回soapMessage.ToString()
&# 160; }
}
评论会员:肖恩-斯图尔特 时间:2011/12/14
喜萨沙

我跟着你的意见,我尝试在VS2005和Blend 3.0与WPF(和逆戟鲸)。我一直在寻找的东西喜欢的DataGridView绑定没有成功的SQL Server数据(或任何)。我已经看到了,我可以绑定到XML数据的混合,但我怎么做绑定的数据吗?
感谢

胡安 - 帕布洛G.C.
{A65}
评论会员:萨沙理发 时间:2011/12/14
您好娟,

滑稽,但我刚走到一门课程,在微软昨天,这表明使用混合了2秒的讲师。我试着在家里和couldnt做到这一点,所以IVE电子邮件他问。生病让你知道他什么时候回来回答OK。


萨沙理发
一个现代的怪胎 - 我做饭,我干净,我喝,我的计划。现代的还是什么?

我的博客:{A63}
评论会员:肖恩-斯图尔特 时间:2011/12/14
然而,另一个一流的文章。它澄清了一些对我的问题。

Quis custodiet IPSOS禁军
评论会员:萨沙理发 时间:2011/12/14
肖恩斯图尔特写道:另一个一流的文章。它澄清了一些对我的问题。

多数民众赞成真的好肖恩。你也像WPF的一部分,theres本文
链接















& #160;




感谢










-