2

我正在尝试解析这段 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>

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

        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”的查询模式的实现。未找到“选择”。

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

4

2 回答 2

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
        };
于 2012-12-05T10:18:03.917 回答
0

那是因为Select是 的扩展IEnumerable,但您选择的是单个元素。对 enumerable 进行查询,并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();

或者简单地说(因此您只有一个要解析的节点,即根节点)。还考虑使用节点转换,而不是读取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") });
于 2012-12-05T10:16:14.593 回答