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();
我有以下 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();