Her*_*ill 6 vb.net kml linq-to-xml
我是一个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>
...
Run Code Online (Sandbox Code Playgroud)
这是我得到的:
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
Run Code Online (Sandbox Code Playgroud)
到目前为止没有好处 - Kml.Descendants("Placemark")给了我一个空的枚举.文档已正确加载 - 因为KML.Descendants包含每个节点.对于它的价值,这些查询也是空的:
Dim foo = Kml.Descendants("Document")
Dim foo = Kml.Descendants("Folder")
Run Code Online (Sandbox Code Playgroud)
有人能指出我正确的方向吗?从优秀的Linq到XML教程的链接的奖励点 - 我在网上找到的那些在非常简单的场景中停止.
这适用于C#:
XDocument doc = XDocument.Load(@"TheFile.kml");
var q = doc.Descendants().Where(x => x.Name.LocalName == "Placemark");
Run Code Online (Sandbox Code Playgroud)
感谢 Spoon16 和 Bruce Murdock 为我指明了正确的方向。Spoon16 发布的代码可以工作,但会强制您将命名空间与每个元素名称连接起来,这并不像我想要的那么干净。
我做了更多搜索,并且弄清楚了应该如何完成此操作 - 这非常简洁,而且我喜欢用于引用 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
Run Code Online (Sandbox Code Playgroud)
请注意第一行中 xmlns 后面的:g 。这为您提供了在其他地方引用此名称空间的快捷方式。
有关 XNamespace 类的更多信息,请参阅MSDN 文档。