遍历 .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;
}
我有一个无法通过 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;
}