LINQ To XML:之复杂的查询举例

XDocument xDocument = new XDocument( new XElement("BookParticipants", new XElement("BookParticipant", new XAttribute("type", "Author"), new XElement("FirstName", "Joe"), new XElement("LastName", "Rattz")), new XElement("BookParticipant", new XAttribute("type", "Editor"), new XElement("FirstName", "Ewan"), new XElement("LastName", "Buckingham")))); IEnumerable<XElement> elements = xDocument .Descendants("BookParticipant") .Where(e => ((string)e.Element("FirstName")) == "Ewan"); foreach (XElement element in elements) { Console.WriteLine("Element: {0} : value = {1}", element.Name, element.Value); }

输入是这样的 Element: BookParticipant : value = EwanBuckingham

前面的文章都只是在简单的foreach所有元素或节点,其实我们在实际项目中是不会那么做的,多数时候会用where ...... 来跳过那个不需要的元素

在多数情况下,我们还需要排序,像下面这样

IEnumerable<XElement> elements = from e in xDocument.Descendants("BookParticipant") where ((string)e.Attribute("type")) != "Illustrator" orderby ((string)e.Element("LastName")) select e;

输出

Element: BookParticipant : value = EwanBuckingh

Element: BookParticipant : value = JoeRattz

下面是一个更加复杂的查询,像sql里面的join语句一样,把两个XML文件按条件进行联合查询

XDocument users = XDocument.Parse( @"<users> <user_tuple> <userid>U01</userid> <name>Tom Jones</name> <rating>B</rating> </user_tuple> <user_tuple> <userid>U02</userid> <name>Mary Doe</name> <rating>A</rating> </user_tuple> <user_tuple> <userid>U03</userid> <name>Dee Linquent</name> <rating>D</rating> </user_tuple> <user_tuple> <userid>U04</userid> <name>Roger Smith</name> <rating>C</rating> </user_tuple> <user_tuple> <userid>U05</userid> <name>Jack Sprat</name> <rating>B</rating> </user_tuple> <user_tuple> <userid>U06</userid> <name>Rip Van Winkle</name> <rating>B</rating> </user_tuple> </users>"); XDocument items = XDocument.Parse( @"<items> <item_tuple> <itemno>1001</itemno> <description>Red Bicycle</description> <offered_by>U01</offered_by> <start_date>1999-01-05</start_date> <end_date>1999-01-20</end_date> <reserve_price>40</reserve_price> </item_tuple> <item_tuple> <itemno>1002</itemno> <description>Motorcycle</description> <offered_by>U02</offered_by> <start_date>1999-02-11</start_date> <end_date>1999-03-15</end_date> <reserve_price>500</reserve_price> </item_tuple> <item_tuple> <itemno>1003</itemno> <description>Old Bicycle</description> <offered_by>U02</offered_by> <start_date>1999-01-10</start_date> <end_date>1999-02-20</end_date> <reserve_price>25</reserve_price> </item_tuple> <item_tuple> <itemno>1004</itemno> <description>Tricycle</description> <offered_by>U01</offered_by> <start_date>1999-02-25</start_date> <end_date>1999-03-08</end_date> <reserve_price>15</reserve_price> </item_tuple> <item_tuple> <itemno>1005</itemno> <description>Tennis Racket</description> <offered_by>U03</offered_by> <start_date>1999-03-19</start_date> <end_date>1999-04-30</end_date> <reserve_price>20</reserve_price> </item_tuple> <item_tuple> <itemno>1006</itemno> <description>Helicopter</description> <offered_by>U03</offered_by> <start_date>1999-05-05</start_date> <end_date>1999-05-25</end_date> <reserve_price>50000</reserve_price> </item_tuple> <item_tuple> <itemno>1007</itemno> <description>Racing Bicycle</description> <offered_by>U04</offered_by> <start_date>1999-01-20</start_date> <end_date>1999-02-20</end_date> <reserve_price>200</reserve_price> </item_tuple> <item_tuple> <itemno>1008</itemno> <description>Broken Bicycle</description> <offered_by>U01</offered_by> <start_date>1999-02-05</start_date> <end_date>1999-03-06</end_date> <reserve_price>25</reserve_price> </item_tuple> </items>"); XDocument bids = XDocument.Parse( @"<bids> <bid_tuple> <userid>U02</userid> <itemno>1001</itemno> <bid>35</bid> <bid_date>1999-01-07</bid_date> </bid_tuple> <bid_tuple> <userid>U04</userid> <itemno>1001</itemno> <bid>40</bid> <bid_date>1999-01-08</bid_date> </bid_tuple> <bid_tuple> <userid>U02</userid> <itemno>1001</itemno> <bid>45</bid> <bid_date>1999-01-11</bid_date> </bid_tuple> <bid_tuple> <userid>U04</userid> <itemno>1001</itemno> <bid>50</bid> <bid_date>1999-01-13</bid_date> </bid_tuple> <bid_tuple> <userid>U02</userid> <itemno>1001</itemno> <bid>55</bid> <bid_date>1999-01-15</bid_date> </bid_tuple> <bid_tuple> <userid>U01</userid> <itemno>1002</itemno> <bid>400</bid> <bid_date>1999-02-14</bid_date> </bid_tuple> <bid_tuple> <userid>U02</userid> <itemno>1002</itemno> <bid>600</bid> <bid_date>1999-02-16</bid_date> </bid_tuple> <bid_tuple> <userid>U03</userid> <itemno>1002</itemno> <bid>800</bid> <bid_date>1999-02-17</bid_date> </bid_tuple> <bid_tuple> <userid>U04</userid> <itemno>1002</itemno> <bid>1000</bid> <bid_date>1999-02-25</bid_date> </bid_tuple> <bid_tuple> <userid>U02</userid> <itemno>1002</itemno> <bid>1200</bid> <bid_date>1999-03-02</bid_date> </bid_tuple> <bid_tuple> <userid>U04</userid> <itemno>1003</itemno> <bid>15</bid> <bid_date>1999-01-22</bid_date> </bid_tuple> <bid_tuple> <userid>U05</userid> <itemno>1003</itemno> <bid>20</bid> <bid_date>1999-02-03</bid_date> </bid_tuple> <bid_tuple> <userid>U01</userid> <itemno>1004</itemno> <bid>40</bid> <bid_date>1999-03-05</bid_date> </bid_tuple> <bid_tuple> <userid>U03</userid> <itemno>1007</itemno> <bid>175</bid> <bid_date>1999-01-25</bid_date> </bid_tuple> <bid_tuple> <userid>U05</userid> <itemno>1007</itemno> <bid>200</bid> <bid_date>1999-02-08</bid_date> </bid_tuple> <bid_tuple> <userid>U04</userid> <itemno>1007</itemno> <bid>225</bid> <bid_date>1999-02-12</bid_date> </bid_tuple> </bids>");

下面是查询的方法

var biddata = from b in bids.Descendants("bid_tuple") where ((double)b.Element("bid")) > 50 join u in users.Descendants("user_tuple") on ((string)b.Element("userid")) equals ((string)u.Element("userid")) join i in items.Descendants("item_tuple") on ((string)b.Element("itemno")) equals ((string)i.Element("itemno")) select new { Item = ((string)b.Element("itemno")), Description = ((string)i.Element("description")), User = ((string)u.Element("name")), Date = ((string)b.Element("bid_date")), Price = ((double)b.Element("bid"))};

打印的代码

Console.WriteLine("{0,-12} {1,-12} {2,-6} {3,-14} {4,10}", "Date", "User", "Item", "Description", "Price"); Console.WriteLine("=========================================================="); There is nothing special about that. All that is left is to enumerate the sequence and display each bid: foreach (var bd in biddata) { Console.WriteLine("{0,-12} {1,-12} {2,-6} {3,-14} {4,10:C}", bd.Date, bd.User, bd.Item, bd.Description, bd.Price); }

输出结果

Date User Item Description Price ========================================================== 1999-01-15 Mary Doe 1001 Red Bicycle $55.00 1999-02-14 Tom Jones 1002 Motorcycle $400.00 1999-02-16 Mary Doe 1002 Motorcycle $600.00 1999-02-17 Dee Linquent 1002 Motorcycle $800.00 1999-02-25 Roger Smith 1002 Motorcycle $1,000.00 1999-03-02 Mary Doe 1002 Motorcycle $1,200.00 1999-01-25 Dee Linquent 1007 Racing Bicycle $175.00 1999-02-08 Jack Sprat 1007 Racing Bicycle $200.00 1999-02-12 Roger Smith 1007 Racing Bicycle $225.00

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值