2012-10-08 192 views
8

我試圖將kml xml谷歌地球文件導入到應用程序中,但我似乎無法獲得xDocument語法,以便做我想做的事,我是想知道是否有人可以建議一種方式來讀取kml xml文件。閱讀XML/KML文件使用C#

我瞭解xml導入的基礎知識,但無法使用xDocument和Linq獲取任何內容,理想情況下我想將每個地標作爲對象並將其添加到我的實體框架驅動的分貝中。任何關於我應該如何做這件事的建議都會很棒,因爲我剛開始使用Linq並可以用一些指針來做。 XML是奠定了如下

<?xml version="1.0" encoding="UTF-8"?> 
<kml xmlns="http://earth.google.com/kml/2.2"> 
    <Document> 
    <Placemark> 
     <name>XXX</name> 
     <description>XXX</description> 
     <styleUrl>XXX</styleUrl> 
     <Point> 
     <coordinates>XXX</coordinates> 
     </Point> 
    </Placemark> 
    <Placemark> 
     <name>XXX</name> 
     <description>XXX</description> 
     <styleUrl>XXX</styleUrl> 
     <Point> 
     <coordinates>XXX</coordinates> 
     </Point> 
    </Placemark> 
    </Document> 
</kml> 
+0

您沒有代碼,請不要忘記下次加入代碼。 – Guvante

回答

7

您沒有包含任何代碼,但我猜測您在引用事件時忘記了包含您的名稱空間。這是一個例子。

基本訪問:

var placemarks = xdoc.Element("kml").Element("Document").Elements("Placemark"); 

使用命名空間:

var ns = XNamespace.Get("http://earth.google.com/kml/2.2"); 
var placemarks = xdoc.Element(ns + "kml").Element(ns + "Document").Elements(ns + "Placemark"); 
+0

使用Get方法而不是隱式轉換的任何原因? –

+0

@JonSkeet:自從我第一次和Linq一起在F#中使用XML之後,我總是忘記了隱式轉換。我的大部分代碼都使用相同的命名空間,所以我複製了這些定義。 – Guvante

5

猜測是,你忘了使用的名稱空間中你的LINQ to XML查詢。這是很容易從這個提取數據:

XNamespace ns = "http://earth.google.com/kml/2.2"; 
var doc = XDocument.Load("file.xml"); 
var query = doc.Root 
       .Element(ns + "Document") 
       .Elements(ns + "Placemark") 
       .Select(x => new PlaceMark // I assume you've already got this 
         { 
          Name = x.Element(ns + "name").Value, 
          Description = x.Element(ns + "description").Value, 
          // etc 
         }); 

如果沒有幫助,請發表你已經試過什麼是完整的例子,什麼地方出了錯。

2
var xDoc = XDocument.Load("a.xml"); 
XNamespace ns = "http://earth.google.com/kml/2.2"; 

var placemarks = xDoc.Descendants(ns+"Placemark") 
        .Select(p => new 
        { 
         Name = p.Element(ns+"name").Value, 
         Desc = p.Element(ns+"description").Value 
        }) 
        .ToList(); 
3

我用SharmpKml及其documentation來提取KML文件的信息。

using SharpKml.Dom; 
using SharpKml.Engine; 
using SharpKml.Dom.GX; 

TextReader reader = File.OpenText(filePath); 
KmlFile file = KmlFile.Load(reader); 
_kml = file.Root as Kml; 

sPlaceMarks[] tempPlaceMarks = new sPlaceMarks[1000]; 
if (_kml != null) 
{ 
    foreach (var placemark in _kml.Flatten().OfType<Placemark>()) 
    { 
    tempPlaceMarks[numOfPlaceMarks].Name = placemark.Name; 
    tempPlaceMarks[numOfPlaceMarks].Description = placemark.Description.Text; 
    tempPlaceMarks[numOfPlaceMarks].StyleUrl = placemark.StyleUrl; 
    tempPlaceMarks[numOfPlaceMarks].point = placemark.Geometry as SharpKml.Dom.Point; 
    tempPlaceMarks[numOfPlaceMarks].CoordinateX = tempPlaceMarks[numOfPlaceMarks].point.Coordinate.Longitude; 
    tempPlaceMarks[numOfPlaceMarks].CoordinateY = tempPlaceMarks[numOfPlaceMarks].point.Coordinate.Latitude; 
    tempPlaceMarks[numOfPlaceMarks].CoordinateZ = tempPlaceMarks[numOfPlaceMarks].point.Coordinate.Altitude; 
    numOfPlaceMarks++; 
    } 

    foreach (var lookAt in _kml.Flatten().OfType<LookAt>()) 
    { 
    Placemark placemark = (Placemark)lookAt.Parent; 
    for (int i = 0; i < numOfPlaceMarks; i++) 
    { 
    if (placemark.Name == tempPlaceMarks[i].Name) 
    { 
     tempPlaceMarks[i].Name = placemark.Name; 
     tempPlaceMarks[i].Description = placemark.Description.Text; 
     tempPlaceMarks[i].StyleUrl = placemark.StyleUrl; 
     tempPlaceMarks[i].altitude = lookAt.Altitude; 
     tempPlaceMarks[i].AltitudeMode =(SharpKml.Dom.GX.AltitudeMode)lookAt.GXAltitudeMode; 
     tempPlaceMarks[i].Heading = lookAt.Heading; 
     tempPlaceMarks[i].Latitude = lookAt.Latitude; 
     tempPlaceMarks[i].Longitude = lookAt.Longitude; 
     tempPlaceMarks[i].Range = lookAt.Range; 
     tempPlaceMarks[i].Tilt = lookAt.Tilt; 
     break; 
    } 
    } 
}