[英]How to use LINQ to perform a simultaneous search of all child items
我的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);
}
目前,我通过使用foreach (XElement xe in Tests)
<Option>
字段来执行上述操作。 但是实际的XML文件比这要详细得多,并且循环变得难以管理。 理想情况下,我想使用LINQ一次搜索所有字段并将其简化为if或statement。
使用LINQ转换为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方法(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,
});
当然,您可以使用匿名类而不是创建一个。
也可以使用XPATH + Linq2Xml
string Name = "Brian";
var xDoc = XDocument.Parse(xmlstring); //or XDocument.Load(filename)
var matches = xDoc
.XPathSelectElements($"//Option/NameStartsWith[starts-with('{Name}', text())]");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.