C# 从与ID列表匹配的Xml中搜索元素

C# 从与ID列表匹配的Xml中搜索元素,c#,.net,xml,linq,list,C#,.net,Xml,Linq,List,嗨,我有一个包含书籍详细信息的xml。xml的结构是- <Root> <Books> <Book> <BookId>1</BookId> <Title>Book 1</Title> <LanguageId>1</LanguageId> <Genres>2,3&

嗨,我有一个包含书籍详细信息的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和图书类型与该列表匹配的图书

为此,我使用了LINQ查询,因为它将比遍历所有book 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节点并添加到集合中,通过ID逐个获取书籍。

您的xml中没有任何GenreId。你有流派,那是以逗号分隔的流派列表。 我想你想做一些事情,比如:

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();
非常简单:

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();
        }
    }

}

是的,流派是用逗号分隔的流派ID。@ThirueswaranRajagopalan谢谢。我在LInqPad中有sam,问题是,我假设,预期的交叉点是什么,可能是,所有类型都应该在listofgenres中。如果我有一个ID列表,并且我想使用linq从xml中获取这些元素,以与我的列表相同的顺序,那么我必须进行哪些更改。通常,我循环遍历xml的所有节点,并逐个按id获取元素,然后将其添加到集合中。@Maksim Simkin我有一个id列表,而我要比较的节点是逗号分隔的id,检索时遇到困难it@Sonali你能再问一个问题吗?对于这一个,您已经有了一个接受的答案。我使用了您的逻辑,但它返回了所有图书节点列表顺序=新列表{1,3,};List books=xldoc.Root.ElementBooks.genderantsbook.OrderByx=>bookids.IndexOfintx.ElementBookId.ToList;然后需要添加:Wherex=>order.Containsintx.ElementBookId