我是一个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#的解决方案提供了简洁的解决方案。

VB9中的XLINQ to XML支持

此外,使用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");
scroll top