2010-03-21 63 views
1

我正在閱讀Kml文件,更改地標名稱並再次保存。無處不在獲取「<kml:...」,更新Kml文件

var KmlFile = XDocument.Load("C:\\Inetpub\\wwwroot\\GeotagService\\Kml\\Photographs.kml"); 

XNamespace KmlNamespace = "http://www.opengis.net/kml/2.2"; 

// find the Placemarks in the Photos folder 
IEnumerable<XElement> Placemarks = KmlFile.Element(KmlNamespace + "kml").Element(KmlNamespace + "Document").Element(KmlNamespace + "Folder").Elements(KmlNamespace + "Placemark"); 

foreach (XElement p in Placemarks){ 
    p.Element(KmlNamespace + "name").Value = "testing"; 
} 

KmlFile.Save("C:\\Inetpub\\wwwroot\\GeotagService\\Kml\\Photographs.kml"); 

然而,當我保存它,元素前綴<kml:,像這樣:

<kml:Folder> 
    <kml:name>Photos</kml:name> 
    <kml:open>1</kml:open> 
    <kml:Placemark> 
    <kml:name>testing</kml:name> 
    <kml:LookAt> 
     <kml:longitude>-10.02717694938161</kml:longitude> 
     <kml:latitude>53.48672543547379</kml:latitude> 
     <kml:altitude>0</kml:altitude> 
    </kml:LookAt> 
    <kml:styleUrl>#msn_ylw-pushpin1</kml:styleUrl> 
    <kml:Point> 
     <kml:coordinates>-10.02867619360582,53.48651240326751,0</kml:coordinates> 
    </kml:Point> 
</kml:Placemark>... 

託默勒格對this question about blank xmlns評論給了我一個線索,這可能是該命名空間之間的不一致文件和元素,但我不明白我是怎麼做到的。有人知道嗎?

編輯:原始文件(部分):

<?xml version="1.0" encoding="UTF-8"?> 
    <kml xmlns="http://www.opengis.net/kml/2.2" xmlns:gx="http://www.google.com/kml/ext/2.2" xmlns:kml="http://www.opengis.net/kml/2.2" xmlns:atom="http://www.w3.org/2005/Atom"> 
    <Document> 
     <name>Connemara.net Photographs</name> 
     <open>1</open> 
     <Style id="sh_ylw-pushpin0"> 
      <IconStyle> 
       <scale>1.3</scale> 
       <Icon> 
        <href>http://maps.google.com/mapfiles/kml/pushpin/ylw-pushpin.png</href> 
       </Icon> 
       <hotSpot x="20" y="2" xunits="pixels" yunits="pixels"/> 
      </IconStyle> 
     </Style> 
     <Folder> 
      <name>Photos</name> 
      <open>1</open> 
      <Placemark> 
       <name>Id:579</name> 
       <LookAt> 
        <longitude>-10.02717694938161</longitude> 
        <latitude>53.48672543547379</latitude> 
        <altitude>0</altitude> 
        <range>213.2931913230747</range> 
        <tilt>75.17546328115256</tilt> 
        <heading>69.89736514305363</heading> 
        <altitudeMode>relativeToGround</altitudeMode> 
        <gx:altitudeMode>relativeToSeaFloor</gx:altitudeMode> 
       </LookAt> 
       <styleUrl>#msn_ylw-pushpin1</styleUrl> 
       <Point> 
        <coordinates>-10.02867619360582,53.48651240326751,0</coordinates> 
       </Point> 
      </Placemark> 
... 
</Folder> 
</Document> 
</kml> 
+0

原始文檔是什麼樣的? – 2010-03-21 07:34:52

回答

2

明白了 - 問題是,原來的文件開始是這樣的:

<kml xmlns="http://www.opengis.net/kml/2.2" 
     xmlns:gx="http://www.google.com/kml/ext/2.2" 
     xmlns:kml="http://www.opengis.net/kml/2.2" 
     xmlns:atom="http://www.w3.org/2005/Atom"> 

的LINQ to XML認爲是有KML命名空間的特定別名,因此使用它。如果刪除該屬性,它將正常工作:

var explicitNs = KmlFile.Root.Attribute(XNamespace.Xmlns + "kml"); 
if (explicitNs != null) 
{ 
    explicitNs.Remove(); 
} 
+0

你,先生,是男人 – 2010-03-21 08:33:56

0

您需要使用namespace manager。下面是使用XPath來選擇所需的標籤,然後更新自己的價值的例子:

using System; 
using System.Xml; 
using System.Xml.Linq; 
using System.Xml.XPath; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var kml = XDocument.Load("test.kml"); 
     var ns = new XmlNamespaceManager(new NameTable()); 
     ns.AddNamespace("kml", "http://www.opengis.net/kml/2.2"); 
     var names = kml.XPathSelectElements("//kml:Placemark/kml:name", ns); 
     foreach (var name in names) 
     { 
      name.Value = "testing"; 
     } 
     kml.Save("test.kml"); 
    } 
} 
+0

我只是使用Linq-to-Xml – 2010-03-21 08:05:16

+0

是的,對不起。事實上,你命名你的局部變量以大寫字母開頭,這讓我認爲你正在使用一些特殊的庫來解析kml,特別是這個語句對我來說很模糊:'KmlFile.Element' :-) – 2010-03-21 08:08:03