XML文件看起来像这样
<osm version="0.6" generator="CGImap 0.0.2">
<bounds minlat="54.0889580" minlon="12.2487570" maxlat="54.0913900" maxlon="12.2524800"/>
<node id="298884269" lat="54.0901746" lon="12.2482632" user="SvenHRO" uid="46882" visible="true" version="1" changeset="676636" timestamp="2008-09-21T21:37:45Z"/>
<node id="261728686" lat="54.0906309" lon="12.2441924" user="PikoWinter" uid="36744" visible="true" version="1" changeset="323878" timestamp="2008-05-03T13:39:23Z"/>
<way id="11103644" visible="true" version="22" changeset="57021161" timestamp="2018-03-09T06:06:21Z" user="thetornado76" uid="1624486">
<nd ref="5058358201"/>
<nd ref="5058358200"/>
<nd ref="459672758"/>
<nd ref="459672757"/>
<nd ref="459672756"/>
<tag k="bicycle" v="no"/>
<tag k="destination" v="Airport"/>
</way>
<way id="11103973" visible="true" version="1" changeset="410956" timestamp="2007-11-05T15:10:28Z" user="DaveHansenTiger" uid="7168">
<nd ref="98983980"/>
<nd ref="98983981"/>
<tag k="tiger:source" v="tiger_import_dch_v0.6_20070809"/>
<tag k="tiger:tlid" v="116306702"/>
<tag k="tiger:upload_uuid" v="bulk_upload.pl-bcfe2a6c-15d8-4c58-8cb2-f0d6e1120159"/>
</way>
</osm>
这是我到目前为止所拥有的
//Removes the "tag" element from xml
osmFile.Root.Elements().Elements().Where(x => x.Name == "tag").Remove();
//Each iteration of query has the an entire <way> elements and all its children
var query = from c in osmFile.Root.Elements("way")
select c;
我的问题是,如何使每个迭代的遍历查询只具有特定方式的nd元素的所有属性值?
例如,如果我这样做
foreach (var x in query)
MessageBox.Show(x.ToString());
第一次迭代将显示
5058358201
5058358200
459672758
459672757
459672756
第二个会显示
98983980
98983981
另外,有没有办法在不首先删除所有标记元素的情况下实现此目的?
答案 0 :(得分:1)
您可以从xml中选择任何内容而不进行修改:
var items = osmFile.Root
.Elements("way")
.Select(x => x.Elements("nd")
.Select(z => z.Attribute("ref").Value));
foreach (var item in items)
{
MessageBox.Show(string.Join(Environment.NewLine, item));
}
如果您没有alrady,则需要添加using System.Linq;
。
答案 1 :(得分:0)
我不习惯在查询linq表单中工作。使用lambda表达式应该是:
osmFile.Root.Elements("way").forEach(wayElement =>
{
var ndElements = wayElement.Where(wayChildElement => wayChildElement.name == "nd");
ndElements.forEach(ndElement => Console.WritteLine(ndElement ););
});
我无法尝试此代码,但应该可以使用。您无法使用linq实现所有功能,因为linq用于数据查询,而不是迭代数据。提供的解决方案是一个单行解决方案,但可以随意采用不同的方式。