我的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。
答案 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())]");