题
我是一个LINQ to XML新手,也是一个KML新手;所以忍受我。
我的目标是从KML文件中提取单个地标。我的KML开始如此:
<?xml version="1.0" encoding="utf-8"?>
<Document xmlns="http://earth.google.com/kml/2.0">
<name>Concessions</name>
<visibility>1</visibility>
<Folder>
<visibility>1</visibility>
<Placemark>
<name>IN920211</name>
<Style>
<PolyStyle>
<color>80000000</color>
</PolyStyle>
</Style>
<Polygon>
<altitudeMode>relativeToGround</altitudeMode>
<outerBoundaryIs>
<LinearRing>
<coordinates>11.728374,1.976421,0 11.732967,1.965322,0 11.737225,1.953161,0 11.635858,1.940812,0 11.658102,1.976874,0 11.728374,1.976421,0 </coordinates>
</LinearRing>
</outerBoundaryIs>
</Polygon>
</Placemark>
<Placemark>
...
就我而言:
Dim Kml As XDocument = XDocument.Load(Server.MapPath("../kmlimport/ga.kml"))
Dim Placemarks = From Placemark In Kml.Descendants("Placemark") _
Select Name = Placemark.Element("Name").Value
到目前为止没有好处 - Kml.Descendants(<!> quot; Placemark <!> quot;)给了我一个空的枚举。文档已正确加载 - 因为KML.Descendants包含每个节点。对于它的价值,这些查询也是空的:
Dim foo = Kml.Descendants("Document")
Dim foo = Kml.Descendants("Folder")
有人能指出我正确的方向吗?从优秀的Linq到XML教程的链接的奖励点 - 我在网上找到的那些在非常简单的场景中停止。
解决方案 2
感谢spoon16和Bruce Murdock将我指向了正确的方向。 spoon16发布的代码有效,但强制您将命名空间与每个元素名称连接起来,这个名称并不像我想的那样干净。
我已经做了一些搜索,我已经弄清楚应该怎么做 - 这是非常简洁的,我喜欢新的<!> lt; ... <!> gt;用于引用XML元素的括号语法。
Imports <xmlns:g='http://earth.google.com/kml/2.0'>
Imports System.Xml.Linq
...
Dim Kml As XDocument = XDocument.Load(Server.MapPath("../kmlimport/ga.kml"))
For Each Placemark As XElement In Kml.<g:Document>.<g:Folder>.<g:Placemark>
Dim Name As String = Placemark.<g:name>.Value
Next
请注意第一行中xmlns后面的:g 。这为您提供了在其他位置引用此命名空间的快捷方式。
有关XNamespace类的更多信息,请参阅 MSDN文档。
其他提示
这适用于C#:
XDocument doc = XDocument.Load(@"TheFile.kml");
var q = doc.Descendants().Where(x => x.Name.LocalName == "Placemark");
Scott Hanselman为那些寻找基于C#的解决方案提供了简洁的解决方案。
此外,使用XNamespace会派上用场,而不仅仅是附加一个字符串。这有点正式。
// This code should get all Placemarks from a KML file
var xdoc = XDocument.Parse(kmlContent);
XNamespace ns = XNamespace.Get("http://earth.google.com/kml/2.0");
var ele = xdoc.Element(ns + "kml").Element(ns + "Document").Elements(ns + "Placemark");
以上修复工作都没有完成这项工作;请参阅我的评论了解详情。我相信spoon16和Bruce Murdock都在正确的轨道上,因为命名空间绝对是个问题。
不隶属于 StackOverflow