2013-12-18 16 views
6

Sto cercando di aggiungere spazi dei nomi a un XmlDocument utilizzando XmlNamespaceManager. Questa è la corrente xml:Aggiunta di spazi dei nomi a XmlDocument utilizzando XmlNamespaceManager

<?xml version="1.0"?> 
<kml> 
    <Document> 
    <Placemark> 
    </Placemark> 
    </Document> 
</kml> 

vorrei che per trasformare a questo xml (utilizzando XmlNamespaceManager):

<?xml version="1.0"?> 
<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" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <Document> 
    <Placemark> 
    </Placemark> 
    </Document> 
</kml> 

Ma io non sono in grado di modificare il codice XML. Ecco il codice, lo so che dovrebbe essere una soluzione semplice:

public void addXmlns() 
     { 

      string xml = @"<?xml version=""1.0""?> 
        <kml> 
        <Document> 
        <Placemark> 
        </Placemark> 
        </Document> 
        </kml>"; 

      var xmldoc = new XmlDocument(); 

      xmldoc.LoadXml(xml); 

      XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmldoc.NameTable); 

      //Add the namespaces 
      nsmgr.AddNamespace("", "http://www.opengis.net/kml/2.2"); 
      nsmgr.AddNamespace("gx", "http://www.google.com/kml/ext/2.2"); 
      nsmgr.AddNamespace("kml", "http://www.opengis.net/kml/2.2"); 
      nsmgr.AddNamespace("atom", "http://www.w3.org/2005/Atom"); 
      nsmgr.AddNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 

      string message; 
      message = xmldoc.InnerXml; 

      MessageBox.Show(message); // still shows the original xml 

     } 

Grazie Prima mano

Update # 1 - provato questo, ma anche non cambia il XML:

public void addXmlns() 
     { 

      string xml = @"<?xml version=""1.0""?> 
        <kml> 
        <Document> 
        <Placemark> 
        </Placemark> 
        </Document> 
        </kml>"; 

      var xmldoc = new XmlDocument(); 

      xmldoc.LoadXml(xml); 

      XmlSchema schema = new XmlSchema(); 
      schema.Namespaces.Add("", "http://www.opengis.net/kml/2.2"); 
      schema.Namespaces.Add("gx", "http://www.google.com/kml/ext/2.2"); 
      schema.Namespaces.Add("kml", "http://www.opengis.net/kml/2.2"); 
      schema.Namespaces.Add("atom", "http://www.w3.org/2005/Atom"); 
      schema.Namespaces.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance"); 
      xmldoc.Schemas.Add(schema); 

      string message; 
      message = xmldoc.InnerXml; 

      MessageBox.Show(message); // still shows the original xml 

     } 

risposta

6

Soluzione: Questo fine ha funzionato:

public void addXmlns() 
{ 
    string xml = @"<?xml version=""1.0""?> 
        <kml> 
        <Document> 
        <Placemark> 
        </Placemark> 
        </Document> 
        </kml>"; 

    var xmldoc = new XmlDocument(); 

    xmldoc.LoadXml(xml); 

    xmldoc.DocumentElement.SetAttribute("xmlns", "http://www.opengis.net/kml/2.2"); 
    xmldoc.DocumentElement.SetAttribute("xmlns:gx", "http://www.google.com/kml/ext/2.2"); 
    xmldoc.DocumentElement.SetAttribute("xmlns:kml", "http://www.opengis.net/kml/2.2"); 
    xmldoc.DocumentElement.SetAttribute("xmlns:atom", "http://www.w3.org/2005/Atom"); 
    xmldoc.DocumentElement.SetAttribute("xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance"); 

    string message; 
    message = xmldoc.InnerXml; 

    MessageBox.Show(message); // shows the updated xml 
} 
+0

Sono curioso di sapere come risolvere il problema in cui sono in esecuzione ... Quando si utilizza lo spazio dei nomi predefinito (xmlns), quindi aggiungere un altro spazio dei nomi suffisso (xmlns: gx), viene visualizzato il seguente errore: 'Il prefisso '' non può essere ridefinito da '' a 'http: // ...' all'interno dello stesso tag dell'elemento di avvio – shortstuffsushi

2

Se si dispone di una conoscenza di XML/XPath/XQuery, si avrà familiarità con questo comportamento.

In breve, il gestore dello spazio dei nomi è specifico per XPath, SelectNodes/SelectSingleNodes; è non destinato alla generazione di XML.

MODIFICA: gli spazi dei nomi aggiunti all'istanza del gestore sono un modo per indicare a XPath che in una stringa di query come questo/doc/mynamespace: mynode, come spiegare e ambito in vari contesti.

+0

Grazie per aver ricordato che XmlNamespaceManager non è destinato a questo scopo. Quale sarebbe il modo corretto di aggiungere spazi dei nomi a un XmlDocument esistente già caricato? (Senza utilizzare XSLT) – user3062349

+0

Vedere questo thread: http://stackoverflow.com/questions/2920142/how-to-add-xmlnamespace-to-a-xmldocument – nim

+0

Grazie nim che ha fatto! Vedi la soluzione sopra. – user3062349