Linq to XML for KML?

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教程的链接的奖励点 - 我在网上找到的那些在非常简单的场景中停止.

Jac*_*cob 6

这适用于C#:

XDocument doc = XDocument.Load(@"TheFile.kml");

var q = doc.Descendants().Where(x => x.Name.LocalName == "Placemark"); 
Run Code Online (Sandbox Code Playgroud)


Her*_*ill 1

感谢 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 文档