我是一名LINQ to XML新手,也是一名KML新手;所以请容忍我。
我的目标是从KML文件中提取单个Placemarks。我的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("Placemark")给我一个空的枚举。文档被正确加载-因为KML.Descendants包含每个节点。值得注意的是,这些查询也是空的:
Dim foo = Kml.Descendants("Document")
Dim foo = Kml.Descendants("Folder")
谁能给我指个方向?链接到好的Linq to XML教程的加分-我在网上找到的那些在非常简单的场景中停止。
发布于 2008-09-30 14:26:16
感谢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
注意第一行中xmlns后面的:g。这为您提供了在其他地方引用此命名空间的快捷方式。
有关XNamespace类的更多信息,请参见MSDN documentation。
发布于 2009-09-29 17:43:58
这适用于我在C#中的工作:
XDocument doc = XDocument.Load(@"TheFile.kml");
var q = doc.Descendants().Where(x => x.Name.LocalName == "Placemark");
发布于 2008-10-21 20:39:30
Scott Hanselman为那些寻找基于C#的解决方案的人提供了一个简洁的解决方案。
XLINQ to XML support in VB9
此外,使用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");
https://stackoverflow.com/questions/151521
复制相似问题