c# - Linq to XML 拉回存在于不同级别的属性

标签 c# xml linq linq-to-xml

我正在尝试编写一个 Linq to XML 查询来提取关键字并包含一个属性(媒体类型)

考虑以下 XML 数据...

    <?xml version="1.0" encoding="utf-8"?>
<media>
    <photos>        
        <photo mediatype="photo" photographer="Jag_cz" description="Colored splashes in abstract shape, isolated on white background" id="16" name="50623755_F.jpg" folder="HR Headset">
            <keywords>
                <keyword>fish</keyword>
                <keyword>abstract</keyword>         
            </keywords>
        </photo>
    </photos>
    <videos>
        <video mediatype="video" description="Bear by a stream" folder="streamfolder" name="stream.mp4">
            <keywords>
                <keyword>stream</keyword>
                <keyword>river</keyword>
                <keyword>water</keyword>
            </keywords>
        </video>
        <video mediatype="video" description="Stream with a bear" folder="bearfolder" name="bear.mp4">
            <keywords>
                <keyword>salmon</keyword>
                <keyword>fish</keyword>
            </keywords>
        </video>
    </videos>
</media>

有照片元素和视频元素。每个元素都有一个 mediattype 属性。

我想返回对每个关键字及其媒体类型的查询。

像这样的..

mediatype   keyword
---------   -------              
photo       fish
photo       abstract
video       stream
video       river
video       water
video       salmon
video       fish

我已经能够使用以下代码拉回关键字...

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

class Program
{
    public static void Main(string[] args)
    {
        String strPath = @"C:\videodata\media.xml";

        XElement xEle = XElement.Load(strPath);

        var keywordquery = from k in xEle.Descendants("keyword")
                           select new
                               {
                                   keyword = (string)k.Value
                               };

        foreach (var k in keywordquery)
        {
            Console.WriteLine(k.keyword);
        }

        Console.WriteLine("Press <enter> to continue");
        Console.ReadLine();
    }
}

但是,我坚持要撤回 mediatype 属性。此属性存在于与关键字不同的级别。

最佳答案

你可以这样做:

var query=  xEle.Descendants().Where(e=>e.Name=="photo" || e.Name=="video")
                              .SelectMany(e=>e.Descendants("keyword")
                                              .Select(x=>new {mediatype=e.Name,
                                                              keyword=x.Value
                                                             }));

总而言之,您首先选择名称为 photovideo 的所有节点,然后根据这些元素中的每一个,您需要获取其中的关键字。使用 SelectMany 扩展方法将结果展平,最终只得到一个集合

关于c# - Linq to XML 拉回存在于不同级别的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42124163/

相关文章:

c# - 可以 react native 应用程序显示在浏览器中

c# - 解析时删除 XML 空格和断行

java - 不同 Activity 中的元素不会折叠

linq - Lambda 查询按日期对列表进行反向排序

c# - 在字符串上使用 += 的任何问题

c# - 如果URL不包含现有 Controller ,则404永远不会达到Application_Error

c# - 将集合转换为字符串的最佳方法

c# - 如何将 'out' 参数传递给 lambda 表达式

c# - 在 ASP.Net Core 中使用分页传递模型参数

c# - 在 C# asp.net 中使用 sqlbulkcopy 将 xml 数据写入 sql server