遍历 .KML 文件并在特定节点的一侧查找值?

Looping through a .KML file and Finding Values in Side a Particular Node?

我有一个无法通过 SharpKml 程序集解析的 .kml 文件;可能格式不兼容--当然,文件中有很多垃圾。

但我发现我可以在 C# 控制台应用程序中使用 XDocument.Load() 函数并查看加载的文档。所以我打算使用标准 .NET xml 函数来解析 .kml 文件。我想我应该可以做到?

基本上,我有兴趣解析与 junk/un-needed 数据一起存在的 <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>

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

你的问题在你想做什么方面有点含糊。您说要解析 <Placemark> 节点,但文件中的 "junk" 之间可能还有其他 <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 和坐标节点。

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