将一个类从Linq填充到XML

时间:2010-10-12 16:59:57

标签: c# .net linq-to-xml

好的,所以我有一个几乎看起来像这样的XML文件:

 <Templates>
    <Template>
        <TemplateID>00X500000011iTSEAY</TemplateID>
        <To>
            <To type='User'>00550000000mfOU</To>
            <To type='User'>00550000000mb3pAAA</To>
            <To type='Group'>00G50000001PiHz</To>
            <To type='AccountTeam'>AccountExecutive</To>
        </To>
        <CC>
            <CC type='AccountTeam'>SalesLead</CC>
        </CC>
        <BCC>
            <BCC type='SalesTeam'>SalesManager</BCC>
        </BCC>
    </Template>
</Templates>

有了这个,我想要做的就是填充一些可以理解它的类。所以我想到的第一个想法是To Elements:

public class EmailRecipient
{
    public ToRecipient To {get;set;}
    public CCRecipient CC {get;set;}
}

public class ToRecipient
{
    public string Key {get;set;}
    public string Type {get;set;}
}

并不完全优雅,但这是我的草稿。我正在尝试使用Linq to XML,因为我知道我有什么TemplateId,然后我可以用值填充类。这就是我在...并且坚持在这个测试应用程序中:

var results = from x in xmlDoc.Descendants(XName.Get("Template")
                      where x.Element(XName.Get("TemplateID")).Value == "00X500000011iTSEAY"
                      select new EmailRecipient()
                        {
                            ToRecipient = 
                        };

说了这么多,我想找到一个“Tos”的集合,其中每个“to”都可以是“type”值。

我非常感谢任何帮助,过去3天我在XML方面的工作量比过去3年多得多,而且并不多。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

由于每个EmailRecipient实例有多个ToRecipient,因此To属性的类型需要是集合类型。如果你把它变成IEnumerable:

    public class EmailRecipient
    {
        public IEnumerable<ToRecipient> To { get; set; }

    }

然后这个LINQ查询应该可以解决这个问题:

var results = from x in xmlDoc.Descendants(XName.Get("Template"))
              where x.Element(XName.Get("TemplateID")).Value == "00X500000011iTSEAY"
              select new EmailRecipient()
              {
                  To = (from to in x.Element("To").Elements("To")
                        select new ToRecipient { Key = to.Value, Type = to.Attribute("type").Value}).ToList()
              };