我正在尝试编写一个 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
}));
总而言之,您首先选择名称为 photo
和 video
的所有节点,然后根据这些元素中的每一个,您需要获取其中的关键字。使用 SelectMany
扩展方法将结果展平,最终只得到一个集合
关于c# - Linq to XML 拉回存在于不同级别的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42124163/