循环通过.KML文件并在特定节点的侧面查找值?

时间:2015-02-12 21:31:18

标签: c# xml parsing kml

我有一个.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>

同样,文档中会有多个这样的节点。我查看了其他代码示例,但它们太复杂了。

1 个答案:

答案 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;
}