繁体   English   中英

使用带有一个或多个关键字的where in子句的Linq to XML

[英]Linq to XML with where in clause with one or many keywords

我有以下XML文件...

    <?xml version="1.0" encoding="utf-8"?>
<photosettings>
    <rootdirectory>c:\phototool\photos\</rootdirectory>
    <photos>
        <photo photographer="Susan Hunter" description="beach scene" folder="beach" name="21562313421.jpg">
            <keywords>
                <keyword>beach</keyword>
                <keyword>sand</keyword>
                <keyword>shells</keyword>
            </keywords>
        </photo>
        <photo photographer="John Smith" description="Beach sunset" folder="beach" name="14123124213.jpg">
            <keywords>
                <keyword>beach</keyword>
                <keyword>sand</keyword>
                <keyword>shells</keyword>
                <keyword>sunset</keyword>
            </keywords>
        </photo>
        <photo photographer="Julie Neuber" description="Overcomming Obstacle" folder="motivation" name="123423413.jpg">
            <keywords>
                <keyword>beach</keyword>
                <keyword>shells</keyword>
            </keywords>
        </photo>
    </photos>
</photosettings>

我想基于关键字搜索来查询XML,并且它可以用于单个关键字...

 using System;
using System.Linq;
using System.Xml.Linq;

class Program
{
    public static void Main(String[] args)
    {
        String strPath = @"C:\phototool\photos.xml";
        XDocument doc = XDocument.Load(strPath);

        var pquery = from p in doc.Descendants("photo")
                     where p.Elements("keywords")
                            .Elements("keyword").Select(k => k.Value).ToArray().Contains("sand")
                     select new
                         {
                             photographer = (string)p.Attribute("photographer"),
                             description = (string)p.Attribute("description"),
                             folder = (string)p.Attribute("folder"),
                             filename = (string)p.Attribute("name"),
                             lstrKeywords = p.Elements("keywords").Elements("keyword").Select(i => i.Value).ToList(),
                         };

        foreach (var p in pquery)
        {
            Console.WriteLine("photographer = {0}, descrption = {1} folder = {2} filename = {3} keywords = {4}", p.photographer, p.description, p.folder, p.filename, String.Join(", ", p.lstrKeywords));
        }
        Console.WriteLine("Press <enter> to continue");
        Console.ReadLine();
    }
}

我想弄清楚如何搜索多个关键字。 实际上,我不知道用户将搜索多少个关键字

我希望查询返回包含keyword1和keyword2的节点。

像这样(不工作的例子)...

   .Elements("keyword").Select(k => k.Value).ToArray().Contains("sand", "beach")

谢谢,

收集要测试的术语,并过滤掉不包含所有术语的项目。

var searchTerms = new[] { "sand", "beach" };
var query =
    from p in doc.Descendants("photo")
    select new
    {
        Photographer = (string)p.Attribute("photographer"),
        Description = (string)p.Attribute("description"),
        Folder = (string)p.Attribute("folder"),
        Filename = (string)p.Attribute("name"),
        Keywords = p.Descendants("keyword").Select(k => (string)k).ToList(),
    } into x
    where searchTerms.All(t => x.Keywords.Contains(t))
    select x;

尝试这个

XDocument doc = XDocument.Load(Server.MapPath("XMLFile.xml"));
List<string> word = new List<string>() { "sand", "beach" };
var list = doc.Root.Elements("photos").Elements("photo").Elements("keywords").Elements("keyword").Where(x => (word.Contains(x.Value))).Select(x => new { PhotoGrapher = x.Parent.Parent.Attribute("photographer"), description = x.Parent.Parent.Attribute("description"), keyword = x.Parent.Elements("keyword").Select(i=>i.Value).ToList() }).ToList();

foreach(var item in list)
{
var PhotoGrapher = item.PhotoGrapher;
//Get other properties you want
}

我刚刚选择了photographer description and keywords您也可以选择其他属性。

我想到了。

关键是将字符串列表(关键字)放在每个循环的a内,并对每个关键字应用.Where过滤器。

这是代码...

using System;
using System.Linq;
using System.Xml.Linq;
using System.Collections.Generic;
class Program
{
    public static void Main(String[] args)
    {
        String strPath = @"C:\phototool\photos.xml";
        XDocument doc = XDocument.Load(strPath);
        List<string> lstrKeywords = new List<string>();
        lstrKeywords.Add("beach");
        lstrKeywords.Add("sunset");

        var pquery = from p in doc.Descendants("photo")
                     select p;

        foreach (string str in lstrKeywords)
        {
            pquery = pquery.Where(i => i.Elements("keywords").Elements("keyword").Select(k => k.Value).ToArray().Contains(str));
        }    
        var pqueryII = from p in pquery
                       select new
                           {
                               photographer = (string) p.Attribute("photographer"),
                               description = (string) p.Attribute("description"),
                               folder = (string) p.Attribute("folder"),
                               filename = (string) p.Attribute("name"),
                               lstrKeywords = p.Elements("keywords").Elements("keyword").Select(i => i.Value).ToList(),
                           };
        foreach (var p in pqueryII)
        {
            Console.WriteLine("photographer = {0}, descrption = {1} folder = {2} filename = {3} keywords = {4}", p.photographer, p.description, p.folder, p.filename, String.Join(", ", p.lstrKeywords));
        }
        Console.WriteLine("Press <enter> to continue");
        Console.ReadLine();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM