繁体   English   中英

使用 XML 和 C# 在多个子节点中搜索值

[英]Searching for values in multiple child node using XML and C#

尝试使用 xElement 在多个子节点中搜索时遇到问题。 我的示例 XML 文件:

 <VIDEOS> <VIDEO> <ID>1</ID> <NAME>AAA</NAME> <ACTORS> <ACTOR> <NAME>AAA</NAME> <URL>www.aaa.com</URL> </ACTOR> <ACTOR> <NAME>BBB</NAME> <URL>www.bbb.com</URL> </ACTOR> <ACTOR> <NAME>CCC</NAME> <URL>www.ccc.com</URL> </ACTOR> </ACTORS> </VIDEO> <VIDEO> <ID>2</ID> <NAME>BBB</NAME> <ACTORS> <ACTOR> <NAME>AAA</NAME> <URL>www.aaa.com</URL> </ACTOR> <ACTOR> <NAME>DDD</NAME> <URL>www.ddd.com</URL> </ACTOR> <ACTOR> <NAME>EEE</NAME> <URL>www.eee.com</URL> </ACTOR> </ACTORS> </VIDEO> <VIDEO> <ID>3</ID> <NAME>CCC</NAME> <ACTORS> <ACTOR> <NAME>CCC</NAME> <URL>www.ccc.com</URL> </ACTOR> <ACTOR> <NAME>BBB</NAME> <URL>www.bbb.com</URL> </ACTOR> <ACTOR> <NAME>EEE</NAME> <URL>www.eee.com</URL> </ACTOR> </ACTORS> </VIDEO> </VIDEOS>

我尝试使用:

var videos = from element in xDocument.Descendants("VIDEO").
    Descendants("ACTORS").
    Descendants("ACTOR").
    Where(e => e.Element("NAME").Value.ToLower().Contains(searchText.ToLower()))
        select new
        {
            Id = element.Element("ID").Value,
            Name = element.Element("NAME").Value,
            Actors = element.Element("ACTORS").Value
        };

使用以下作品,但我需要搜索所有演员姓名并从节点获取所有视频详细信息。 请帮忙!

var videos = from element in xDocument.Descendants("VIDEO").
    Where(e => e.Element("ACTORS").Value.ToLower().Contains(searchText.ToLower()))
        select new
        {
            Id = element.Element("ID").Value,
            Name = element.Element("NAME").Value,
            Actors = element.Element("ACTORS").Value
        };

试试这个代码,

static void Main(string[] args)
        {
            string searchText = "eee";
            XDocument xDocument = XDocument.Load(@"test.xml");
            var videos = from element in xDocument.Descendants("VIDEO").
                         Where(e => e.Descendants("ACTORS").
                         Descendants("ACTOR").Any(actor => actor.Element("NAME").Value.ToLower().Contains(searchText.ToLower())))
                         select new
                         {
                             Id = element.Element("ID").Value,
                             Name = element.Element("NAME").Value,
                             Actors = element.Element("ACTORS").Descendants("ACTOR").Select(y => new
                             {
                                 name = y.Element("NAME").Value,
                                 url = y.Element("URL").Value
                             })
                         };
        }

试试下面的代码。 如果您想要单个列表,则需要添加到 SelectMany() 结尾。

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

namespace ConsoleApplication82
{
    class Program
    {
        static void Main(string[] args)
        {
            string xml =
                "<VIDEOS>" +
                    "<VIDEO>" +
                        "<ID>1</ID>" +
                        "<NAME>AAA</NAME>" +
                        "<ACTORS>" +
                            "<ACTOR>" +
                                "<NAME>AAA</NAME>" +
                                "<URL>www.aaa.com</URL>" +
                            "</ACTOR>" +
                            "<ACTOR>" +
                                "<NAME>BBB</NAME>" +
                                "<URL>www.bbb.com</URL>" +
                            "</ACTOR>" +
                            "<ACTOR>" +
                                "<NAME>CCC</NAME>" +
                                "<URL>www.ccc.com</URL>" +
                            "</ACTOR>" +
                        "</ACTORS>" +
                    "</VIDEO>" +
                    "<VIDEO>" +
                        "<ID>2</ID>" +
                        "<NAME>BBB</NAME>" +
                        "<ACTORS>" +
                            "<ACTOR>" +
                                "<NAME>AAA</NAME>" +
                                "<URL>www.aaa.com</URL>" +
                            "</ACTOR>" +
                            "<ACTOR>" +
                                "<NAME>DDD</NAME>" +
                                "<URL>www.ddd.com</URL>" +
                            "</ACTOR>" +
                            "<ACTOR>" +
                                "<NAME>EEE</NAME>" +
                                "<URL>www.eee.com</URL>" +
                            "</ACTOR>" +
                        "</ACTORS>" +
                    "</VIDEO>" +
                    "<VIDEO>" +
                        "<ID>3</ID>" +
                        "<NAME>CCC</NAME>" +
                        "<ACTORS>" +
                            "<ACTOR>" +
                                "<NAME>CCC</NAME>" +
                                "<URL>www.ccc.com</URL>" +
                            "</ACTOR>" +
                            "<ACTOR>" +
                                "<NAME>BBB</NAME>" +
                                "<URL>www.bbb.com</URL>" +
                            "</ACTOR>" +
                            "<ACTOR>" +
                                "<NAME>EEE</NAME>" +
                                "<URL>www.eee.com</URL>" +
                            "</ACTOR>" +
                        "</ACTORS>" +
                    "</VIDEO>" +
                "</VIDEOS>";

            XDocument doc = XDocument.Parse(xml);

            var results = doc.Descendants("VIDEO").Select(x => new {
                id = (int)x.Element("ID"), 
                name = (string)x.Element("NAME"),
                actors = x.Descendants("ACTOR").Select(y => new {
                    name = (string)y.Element("NAME"),
                    url = (string)y.Element("URL")
                }).ToList()
            }).ToList();

        }

    }
}

暂无
暂无

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

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