OpenStreetMap XML 到对象

OpenStreetMap XML to Object

我有以下 XML,我想通过使用 XDocument 获得特定值。例如最大速度。

<?xml version="1.0" encoding="UTF-8"?>
<osm version="0.6" generator="Overpass API">
 <meta osm_base="2015-01-15T20:26:03Z"/>
 <node id="1312239864" lat="50.5348877" lon="5.6286790">
  <tag k="highway" v="crossing"/>
  <tag k="traffic_calming" v="bump"/>
 </node>
 <node id="2025084665" lat="50.5345623" lon="5.6274183">
  <tag k="traffic_calming" v="choker"/>
 </node>
 <node id="2025084669" lat="50.5353414" lon="5.6303289"/>
 <way id="191950462">
  <nd ref="2025084665"/>
  <tag k="bicycle" v="yes"/>
  <tag k="highway" v="secondary"/>
  <tag k="maxspeed" v="30"/>
  <tag k="name" v="Rue d'Esneux"/>
  <tag k="source:maxspeed" v="school zone"/>
 </way>
</osm>

我试过了

way.Tags = (List<OSMTag>)(doc.Descendants ("tag").Select (c => new OSMTag () {
            Key = c.Attribute ("k").Value,
            Value = c.Attribute ("v").Value
        }));

但是我得到一个 InvalidCastException。

下面是我的对象模型。

public class OSMWay
{
    public OSMWay (){}
    public List<OSMTag> Tags { get; set; }
}

public class OSMTag
{
    public OSMTag (){}

    public OSMTag (string key, string value)
    {
        Key = key;
        Value = value;
    }
    public string Key { get; set; }
    public string Value { get; set; }
}

你得到一个 IEnumerable 返回:

way.Tags = doc.Descendants ("tag").Select (c => new OSMTag () {
        Key = c.Attribute ("k").Value,
        Value = c.Attribute ("v").Value
    }).ToList();

应该可以解决问题。列表实现 IEnumerable 但并非每个 IEnumerable 都是列表。 ToList() 扩展将 IEnumerable 转换为 List

还不是列表:

way.Tags = (List<OSMTag>)(doc.Descendants ("tag").Select (c => new OSMTag () {
            Key = c.Attribute ("k").Value,
            Value = c.Attribute ("v").Value
        })).ToList();