2010-03-21 7 views
1

Je lis dans un fichier Kml, en changeant les noms des repères et en les sauvegardant de nouveau.Obtenir "<kml: ..." partout, mettre à jour un fichier 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"); 

Lorsque je l'enregistre cependant chaque élément est préfixé avec <kml:, comme ceci:

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

commentaire de Tomalak sur this question about blank xmlns me donne une idée qu'il pourrait y avoir des incohérences entre les namespaces du document et les éléments, mais je ne vois pas comment je le fais. Quelqu'un sait?

EDIT: Document original (en partie):

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

À quoi ressemble le document d'origine? –

Répondre

2

Got it - le problème est que le document original commence comme ceci:

<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 voit qu'il ya un alias spécifique pour l'espace de noms KML, utilise donc cela. Si vous supprimez cet attribut, cela fonctionne correctement:

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

Vous, monsieur, sont l'homme –

0

Vous devez utiliser un namespace manager. Voici un exemple en utilisant XPath pour sélectionner les balises nécessaires et mettre à jour leur valeur:

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

Je n'utilise que Linq-to-Xml –

+0

Oui, désolé à ce sujet. Le fait que vous nommiez vos variables locales commence par une lettre majuscule m'a fait penser que vous utilisez une bibliothèque spéciale pour analyser kml, particulièrement cette déclaration était assez ambigu pour moi: 'KmlFile.Element' :-) –