2012-10-08 49 views
8

Tôi đang cố gắng nhập tệp Google Earth kml xml vào một ứng dụng, nhưng tôi dường như không thể nhận cú pháp xDocument ngay để thực hiện những gì tôi muốn, tôi tự hỏi nếu có ai có thể gợi ý một cách để đọc trong tập tin xml kml.Đọc trong tệp XML/KML bằng C#

Tôi hiểu những điều cơ bản về nhập xml nhưng không thể nhận được bất kỳ thứ gì hoạt động với xDocument và LINQ, lý tưởng là tôi muốn đặt từng Dấu vị trí làm đối tượng và thêm chúng vào db khung Entity Framework của tôi. Bất kỳ đề xuất nào về cách tôi nên làm điều này sẽ là tuyệt vời, vì tôi chỉ mới bắt đầu với LINQ và có thể làm với một số gợi ý. Xml được đặt ra như sau

<?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

Bạn không có mã, vui lòng không bao gồm mã lần sau. – Guvante

Trả lời

7

Bạn không bao gồm bất kỳ mã nào, nhưng tôi đoán bạn đã quên bao gồm không gian tên của mình khi tham chiếu mọi thứ. Đây là một ví dụ.

truy cập cơ bản:

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

Sử dụng không gian tên:

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

Bất kỳ lý do nào để sử dụng phương thức 'Get' thay vì chuyển đổi ngầm định? –

+0

@JonSkeet: Tôi luôn quên về chuyển đổi tiềm ẩn kể từ lần đầu tiên tôi làm việc với LINQ to XML trong F #. Hầu hết mã của tôi đều sử dụng các không gian tên giống nhau nên tôi sao chép xung quanh các định nghĩa. – Guvante

5

My đoán là bạn đã quên sử dụng không gian tên trong LINQ của bạn để truy vấn XML. Thật dễ dàng để trích xuất dữ liệu từ điều này:

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 
         }); 

Nếu điều đó không giúp được, hãy viết một ví dụ hoàn chỉnh về những gì bạn đã thử và những gì đã xảy ra.

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

tôi đã sử dụng SharmpKmldocumentation của nó để trích xuất thông tin từ tệp 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; 
    } 
    } 
}