4

次のように 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' にキャストできません。

ノードの値を確認すると、場所の子からすべての要素を適切に取得していますが、それを分割したくありません。これに似たエラーをチェックしましたが、何が間違っているのかわかりません。助言がありますか?

4

2 に答える 2

8

要素または属性を 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 に属性または要素が欠落している可能性がある場合は (nullable) にします。Valueその場合にプロパティにアクセスすると、 が発生しますNullReferenceException

于 2013-01-19T21:02:47.140 に答える
1

あなたは単に.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)
                  };  
于 2013-01-19T21:27:29.043 に答える