我有一个.kml文件,我无法通过SharpKml程序集解析;可能格式不兼容 - 当然,文件中有很多垃圾。
但我发现我可以在C#控制台应用程序中使用XDocument.Load()
函数并查看加载的文档。所以我打算使用标准的.NET xml函数来解析.kml文件。我想我应该能做到吗?
基本上,我有兴趣解析存在的<PlaceMark>
节点以及垃圾/不需要的数据。这是节点的结构:
<Placemark>
<Snippet></Snippet>
<styleUrl>#style0</styleUrl>
<ExtendedData>
<SchemaData schemaUrl="#Bracket_Hall_RoomData">
<SimpleData name="FID">0</SimpleData>
<SimpleData name="Room">230C</SimpleData>
</SchemaData>
</ExtendedData>
<Polygon>
<extrude>false</extrude>
<tessellate>false</tessellate>
<outerBoundaryIs>
<LinearRing>
<extrude>false</extrude>
<tessellate>false</tessellate>
<coordinates>-82.836315,34.678898,0.000000 -82.836317,34.678886,0.000000...</coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
同样,文档中会有多个这样的节点。我查看了其他代码示例,但它们太复杂了。
答案 0 :(得分:1)
就你要做的事而言,你的问题有点模糊。您说您要解析<Placemark>
节点,但文件中的“垃圾”中可能还有其他<Placemark>
个节点。目前还不清楚您是想要所有<Placemark>
节点还是特定节点。因此,猜测一下,一旦将XML加载到XDocument中,就可以发出LINQ-to-XML查询以获取所有<Placemark>
个节点。
var placemarks =
(from x in xDoc.Descendants()
where x.Name.LocalName == "Placemark"
select new XElement(x)).ToList();
现在,您可以遍历placemarks
变量(这是一个集合),并为每个变量执行所需操作。这是一个非常简单的实现,假设每个地标只有一个fid,room和coordinates节点。
foreach (var placemark in placemarks)
{
var fid = (from x in placemark.Descendants("SimpleData")
where x.Attribute("name").Value == "FID"
select x).First().Value;
var room = (from x in placemark.Descendants("SimpleData")
where x.Attribute("name").Value == "Room"
select x).First().Value;
var coord = (from x in placemark.Descendants("coordinates")
select x).First().Value;
}