2013-12-18 4 views
6

Ich versuche, Namespaces zu einem XmlDocument mit XmlNamespaceManager hinzufügen. Dies ist die aktuelle xml:Hinzufügen von Namespaces zu XmlDocument mithilfe von XmlNamespaceManager

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

ich möchte es auf diese XML-Transformation (mit 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> 

Aber ich bin nicht in der Lage die XML zu ändern. Hier ist der Code, ich weiß, soll es eine einfache Lösung sein:

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 

     } 

Dank Bevor Hand

Update # 1 - versucht, diese aber es ist auch nicht die XML ändern:

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 

     } 

Antwort

6

Lösung: Das endlich geklappt:

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

Ich bin gespannt, wie Sie das Problem umgehen, in das ich hineingeraten bin ... Wenn Sie den Standard-Namespace (xmlns) verwenden und dann einen anderen Suffix-Namespace (xmlns: gx) hinzufügen, erhalte ich den folgenden Fehler: 'Das Präfix '' kann nicht von '' auf 'http: // ...' innerhalb desselben Startelement-Tags neu definiert werden.' – shortstuffsushi

2

Wenn Sie etwas über XML/XPath/XQuery wissen, werden Sie mit diesem Verhalten vertraut sein.

Kurz gesagt, der Namespace-Manager ist für XPath, SelectNodes/SelectSingleNodes spezifisch; Es ist nicht für die Generierung von XML vorgesehen.

BEARBEITEN: Die Namespaces, die der Managerinstanz hinzugefügt werden, sind eine Möglichkeit, XPath mitzuteilen, dass in einer Abfragezeichenfolge wie diesem/doc/mynamespace: mynode erläutert und in verschiedenen Kontexten definiert werden kann.

+0

Dank für den Hinweis auf, dass XmlNamespaceManager nicht für diesen Zweck bestimmt ist. Was wäre der richtige Weg, um Namespaces zu einem vorhandenen XmlDocument hinzuzufügen, das bereits geladen ist? (Ohne XSLT) – user3062349

+0

Sehen Sie diesen Thread: http://StackOverflow.com/Questions/2920142/How-to-add-xmlnamespace-to-a-xmldocument – nim

+0

Danke Nim, dass es getan hat! Siehe obige Lösung. – user3062349

Verwandte Themen