Linq简单的XML片段为非匿名类型

时间:2012-12-05 10:12:51

标签: linq c#-4.0 xml-parsing anonymous-types

我正在尝试解析这段XML

<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
 <DagUren>
   <Chauffeur>Vincent</Chauffeur>
   <AanmeldTijd>4 dec. 2012 09:05:42</AanmeldTijd>
   <Gewerkt>04:42</Gewerkt>
 </DagUren>

我创建了一个包含Chauffer,AanmeldTijd,Gewerkt等字符串的DagUren类。

        DagUren eenDagUren
            = (from du in doc.Element("DagUren")
               select new DagUren
               {
                   Chauffeur = du.Element("Chauffeur").Value,
                   Gewerkt = du.Element("Gewerkt").Value,
                   Pauze = du.Element("Pauze").Value,
                   AanmeldTijd = du.Element("AanmeldTijd").Value,
               }
         );

编译器响应:无法找到源类型“System.Xml.Linq.XElement”的查询模式的实现。 “选择”未找到。

请建议,我花了很多时间重写它,每个指南都使用不同的方法......

2 个答案:

答案 0 :(得分:2)

你的问题是,Element()没有返回XElement的集合,它只返回一个对象。 Linq只查询项目集合,而不是单个对象。所以你的解决方案是:

XElement du = doc.Element("DagUren");
DagUren ennDagUren =
    new DagUren
        { 
            Chauffeur = du.Element("Chauffeur").Value,
            Gewerkt = du.Element("Gewerkt").Value,
            Pauze = du.Element("Pauze").Value,
            AanmeldTijd = du.Element("AanmeldTijd").Value
        };

答案 1 :(得分:0)

这是因为SelectIEnumerable的扩展名,但您选择的是单个元素。对可枚举进行查询,并在结尾处应用SingleOrDefault

 DagUren eenDagUren
            = (from du in doc.Elements("DagUren")
               select new DagUren
               {
                   Chauffeur = du.Element("Chauffeur").Value,
                   Gewerkt = du.Element("Gewerkt").Value,
                   Pauze = du.Element("Pauze").Value,
                   AanmeldTijd = du.Element("AanmeldTijd").Value,
               }).SinleOrDefault();

或简单(因此您只有一个要解析的节点,即root)。还要考虑使用节点转换,而不是阅读Value属性:

 XElement root = doc.Root;
 DagUren eenDagUren = new DagUren() {
               Chauffeur = (string)root.Element("Chauffeur"),
               Gewerkt = (TimeSpan)root.Element("Gewerkt"),
               Pauze = (bool)root.Element("Pauze"), // e.g. 
               AanmeldTijd = (DateTime)root.Element("AanmeldTijd") });