【问题标题】:Looping through a .KML file and Finding Values in Side a Particular Node?循环遍历 .KML 文件并在特定节点侧查找值?
【发布时间】:2015-02-12 21:31:18
【问题描述】:

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

但我发现我可以在 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>

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

【问题讨论】:

    标签: c# xml parsing kml


    【解决方案1】:

    就您要做什么而言,您的问题有点模糊。您说您要解析 &lt;Placemark&gt; 节点,但文件中的“垃圾”中可能还有额外的 &lt;Placemark&gt; 节点。目前尚不清楚您是想要所有 &lt;Placemark&gt; 节点还是特定一个节点。因此,猜测一下,一旦您将 XML 加载到 XDocument 中,您就可以发出 LINQ-to-XML 查询来获取所有 &lt;Placemark&gt; 节点。

    var placemarks =
        (from x in xDoc.Descendants()
         where x.Name.LocalName == "Placemark"
         select new XElement(x)).ToList();
    

    您现在可以遍历 placemarks 变量(它是一个集合),并对每个变量执行您需要的操作。这是一个非常简单的实现,假设每个地标只有一个 fid、房间和坐标节点。

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

    【讨论】:

    • 嗨,是的,我需要所有 Placemark 节点;我会试试你的代码。关于如何遍历每个 Placemark 节点和输出节点名称/值的任何提示?
    • 循环很简单,使用forforeach 循环。你在说什么价值? &lt;Placemark&gt; 节点没有值,它有一堆子节点。
    • 我需要 FID、ROOM 和坐标值。谢谢。我已接受您的回答。
    • 克雷格。也非常感谢循环代码。使用 SharpKml 方式的失败尝试让我筋疲力尽,否则我会想通的。再次感谢!这是一个很大的帮助。
    猜你喜欢
    • 1970-01-01
    • 2021-10-02
    • 2021-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-28
    • 1970-01-01
    • 2021-06-22
    相关资源
    最近更新 更多