搜索Xml中的元素与ID

时间:2017-01-26 07:53:20

标签: c# .net xml linq list

您好我有一个包含书籍详细信息的xml。 xml的结构是 -

<Root>
    <Books>
        <Book>
            <BookId>1</BookId>
            <Title>Book 1</Title>
            <LanguageId>1</LanguageId>
            <Genres>2,3</Genres>
            <BookType>1</BookType>
            <Description>Lorem Ipsum</Description>
        </Book>
        <Book>
            <BookId>3</BookId>
            <Title>Book 3</Title>
            <LanguageId>3</LanguageId>
            <Genres>12,23</Genres>
            <BookType>2</BookType>
            <Description>Lorem Ipsum</Description>
        </Book>
        <Book>
            <BookId>3</BookId>
            <Title>Book 2</Title>
            <LanguageId>2</LanguageId>
            <Genres>1,13</Genres>
            <BookType>2</BookType>
            <Description>Lorem Ipsum</Description>
        </Book>
         <Book>
            <BookId>4</BookId>
            <Title>Book 4</Title>
            <LanguageId>2</LanguageId>
            <Genres>1,13</Genres>
            <BookType>2</BookType>
            <Description>Lorem Ipsum</Description>
        </Book>
    </Books>
</Root>

一本书可以有多种类型ID,可以有多种语言。 我有一个类型ID列表,语言列表和书籍类型列表。

我想获取所有类型ID,语言ID和booktype与该列表匹配的书籍。

我使用LINQ查询,因为循环遍历所有书籍xml节点会更有效 -

  List<XElement> elems = xldoc.Root.Descendants("Books")
                                     .Descendants("Book")
                                     .Where(x=> 
                                   (listofgenres.Contains(x.Element("GenreId").Value)) &&  
                                   (listoflanguages.Contains(x.Element("LanguageId").Value)) &&
                                   (listofbooktypes.Contains(x.Element("BookType").Value)))
                                    .ToList();

但它并没有像我想的那样取得结果。我做错了什么???

如果假设我有一个像1,3,4,2这样的bookId列表,我想以与我的列表相同的顺序获取这些ID的书,而linq则是另一种方式。现在我通过循环遍历所有xml节点并添加到集合中逐个获取书籍。

2 个答案:

答案 0 :(得分:1)

你的xml中没有GenreId。你有Genres,这是逗号分隔的流派列表。 我想你想做点什么:

List<XElement> elems = xldoc.Root.Descendants("Books")
        .Descendants("Book")
        .Where(x=> (listofgenres.Intersect(x.Element("Genres").Value.Split(',')).Any())
                   && (listoflanguages.Contains(x.Element("LanguageId").Value)) 
                   && (listofbooktypes.Contains(x.Element("BookType").Value)))
        .ToList();

答案 1 :(得分:0)

很简单:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml;
using System.Xml.Linq;



namespace ConsoleApplication43
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            List<int> order = new List<int>() { 1, 3, 4, 2 };
            XDocument doc = XDocument.Load(FILENAME);

            List<XElement> books = doc.Descendants("Book").OrderBy(x => order.IndexOf((int)x.Element("BookId"))).ToList();
        }
    }

}