将多个xml元素值添加到列表中

时间:2013-03-28 14:20:02

标签: xml linq

以下代码有效但我想完成相同的结果,即使用一个查询将元素“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();

    }
}

1 个答案:

答案 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 ) );