如何使用LINQ同时搜索所有子项

时间:2016-09-24 21:42:09

标签: c# xml linq

我的XML文件结构如下:

<File>
<Setting1></Setting1>
<Setting2></Setting2>
<Options>
    <Option>
        <NameStartsWith>Br</NameStartsWith>
        <Data>1234</Data>
    </Option>
    <Option>
        <NameStartsWith>Ch</NameStartsWith>
        <Data>4567</Data>
</Option>
</Options>
</File>

我想做的是使用LINQ,如下所示..

String Name = "Brian";
if(Name.StartsWith(LINQ.Any.NameStartsWith)))
{
 Console.WriteLine("The Answer is: " 1234);
}

目前,我通过使用<Option>循环遍历foreach (XElement xe in Tests)字段来执行上述操作。但真正的XML文件比这更详细,循环变得难以管理。理想情况下,我希望使用LINQ一次搜索所有字段,并使其成为简单的if或statement。

2 个答案:

答案 0 :(得分:1)

使用LINQ to Xml

string name = "Brian";
XDocument doc = XDocument.Load(yourXmlFile);
var matches = doc.Root
                 .Descendants("Option")
                 .Where(option => name.StartsWith(option.Element("NameStartsWith").Value))
                 .Select(option => option.Element("Data").Value);

foreach(var data in matches)
{
    Console.WriteLine("The Answer is: {data}");
}

XContainer.Descendants Method (XName)将返回名称作为参数从当前XElement的所有层次级别传递的所有元素。

如果NameStartsWith中的元素Option是可选的,那么只需在LINQ方法链中添加对null的检查。如果不存在此类元素,XElement.Element(XName name)将返回null

var matches = doc.Root
                 .Descendants("Option")
                 .Where(option => option.Element("NameStartsWith") != null)
                 .Where(option => name.StartsWith(option.Element("NameStartsWith").Value))
                 .Select(option => option.Element("Data").Value);

如果Option元素包含多个需要选择的其他元素,则创建一个表示所有需要数据的类并将其填入Select方法

public class Option
{
    public string NameStartsWith {get; set; }
    public string Data {get; set; }
    public string ElementOne {get; set; }
    public string ElementTwo {get; set; }
}

var matches = doc.Root
                 .Descendants("Option")
                 .Where(option => option.Element("NameStartsWith") != null)
                 .Where(option => name.StartsWith(option.Element("NameStartsWith").Value))
                 .Select(option => new Option
                 {
                     NameStartsWith = option.Element("Data").Value,
                     Data = option.Element("Data").Value,
                     ElementOne = option.Element("ElementOne").Value,
                     ElementTwo = option.Element("ElementTwo").Value,
                 });

当然,你可以使用匿名类而不是创建一个。

答案 1 :(得分:1)

XPATH + Linq2Xml也是可能的

string Name = "Brian";
var xDoc = XDocument.Parse(xmlstring); //or XDocument.Load(filename)
var matches = xDoc
       .XPathSelectElements($"//Option/NameStartsWith[starts-with('{Name}', text())]");