以下代码有效但我想完成相同的结果,即使用一个查询将元素“triptype”和“description”的不同值插入到列表中。任何帮助将不胜感激。
提前致谢, 马塞洛
class Program
{
static void Main(string[] args)
{
string xml = @"<Trips>
<Trip>
<triptype>vacation</triptype>
<description>Trip to Bahamas</description>
<id>89</id>
</Trip>
<Trip>
<triptype>vacation</triptype>
<description>Trip to California</description>
<id>75</id>
</Trip>
<Trip>
<triptype>business</triptype>
<description>Trip to Chicago</description>
<id>82</id>
</Trip>
</Trips>";
List<string> trips = new List<string>();
XDocument xdoc = XDocument.Parse(xml);
var tripTypes = (from t in xdoc.Descendants("Trip")
.Elements("triptype")
select t.Value).Distinct();
foreach (var tripType in tripTypes)
{
trips.Add(tripType);
}
var tripDescriptions = (from t in xdoc.Descendants("Trip")
.Elements("description")
select t.Value).Distinct();
foreach (var tripDescription in tripDescriptions)
{
trips.Add(tripDescription);
}
Console.ReadLine();
}
}
答案 0 :(得分:2)
AFAIK,当您尝试使用不同的值时,无法使用单个LINQ to XML查询选择多个元素。
但是,您可以将序列投影到具有每个元素值的匿名类型,然后找到不同的值,但我怀疑这可能比您现在正在做的事情更难以理解,即
var query = xdoc.Root.Elements( "Trip" )
.Select( x => new
{
trip = x.Element( "triptype" ).Value,
desc = x.Element( "description" ).Value
} ).ToList();
trips.AddRange( query.Select( x => x.trip ).Union( query.Select( x => x.desc ) ).Distinct() );
相反,我建议使用List.AddRange代替foreach
循环进行轻微清理,并使用与现在使用相同的逻辑,方法是为每个节点获取每个不同的值集需要:
var q1 = xdoc.Descendants( "triptype" ).Select( x => x.Value ).Distinct();
var q2 = xdoc.Descendants( "description" ).Select( x => x.Value ).Distinct();
trips.AddRange( q1.Union( q2 ) );