Linq转换Xelement错误:无法转换类型为'System.Xml.Linq.XElement'键入

本文关键字:Linq 转换 Xml 键入 XElement System 类型 错误 Xelement | 更新日期: 2023-09-27 17:54:24

我试图解析XML文档如下:

var locs = from node in doc.Descendants("locations")                              
select new
{
    ID = (double)Convert.ToDouble(node.Attribute("id")),
    File = (string)node.Element("file"),
    Location = (string)node.Element("location"),
    Postcode = (string)node.Element("postCode"),
    Lat = (double)Convert.ToDouble(node.Element("lat")),
    Lng = (double)Convert.ToDouble(node.Element("lng"))
};  

我得到错误:

无法强制转换类型为"System.Xml.Linq"的对象。XElement'的类型"System.IConvertible"。

当我检查节点的值时,我从位置子节点正确地获得所有元素,但它不想为我打破它。我已经检查了类似的错误,但无法找出我做错了什么。有什么建议吗?

Linq转换Xelement错误:无法转换类型为'System.Xml.Linq.XElement'键入

不需要将元素或属性转换为double类型。只需将它们强制转换为double:

var locs = from node in doc.Descendants("locations")
           select new
           {
               ID = (double)node.Attribute("id"),
               File = (string)node.Element("file"),
               Location = (string)node.Element("location"),
               Postcode = (string)node.Element("postCode"),
               Lat = (double)node.Element("lat"),
               Lng = (double)node.Element("lng")
           };    

Linq to Xml支持显式强制转换操作符

是的,XElement没有实现IConvertable接口,因此你不能把它传递给Convert.ToDouble(object value)方法。您的代码将通过将节点值传递给Convert.ToDouble(string value)方法来工作。这样的:

Lat = Convert.ToDouble(node.Element("lat").Value)

但是,最好还是将节点转换为double类型。或double?(可空),如果它是可能的,您可以有丢失的属性或元素在您的xml。在这种情况下,访问Value属性将引发NullReferenceException

你是不是错过了.Value属性

                  var locs = from node in doc.Descendants("locations")
                  select new
                  {
                      ID = Convert.ToDouble(node.Attribute("id").Value),
                      File = node.Element("file").Value,
                      Location = node.Element("location").Value,
                      Postcode = node.Element("postCode").Value,
                      Lat = Convert.ToDouble(node.Element("lat").Value),
                      Lng = Convert.ToDouble(node.Element("lng").Value)
                  };