2013-12-18 93 views
6

我試圖使用XmlNamespaceManager將名稱空間添加到XmlDocument。這是當前xml:使用XmlNamespaceManager將名稱空間添加到XmlDocument

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

我想它轉換到這個XML(使用的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> 

但我不能改變的XML。下面是代碼,我知道這應該是一個簡單的辦法:

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 

     } 

感謝前手

更新#1 - 試過,但它也不會改變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 

     } 

回答

6

解決方案:這最後的工作:

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

我很好奇你是如何解決我遇到的問題...當你使用默認名稱空間(xmlns),然後添加另一個後綴名稱空間(xmlns:gx)時,出現以下錯誤: '在同一起始元素標籤內,前綴''不能從''重新定義爲'http:// ...' – shortstuffsushi

2

如果您有一些關於XML/XPath/XQuery的知識,那麼您會對此行爲感到滿意。

簡而言之,名稱空間管理器專門用於XPath,SelectNodes/SelectSingleNodes;它是用於生成XML的而不是

編輯:添加到管理器實例的名稱空間是一種告訴XPath,在這樣的/ doc/mynamespace:mynode查詢字符串中,如何在各種上下文中解釋和範圍的方法。

+0

感謝指出的XmlNamespaceManager不用於這一目的。將名稱空間添加到已加載的現有XmlDocument的正確方法是什麼? (不使用XSLT) – user3062349

+0

看到這個線程:http://stackoverflow.com/questions/2920142/how-to-add-xmlnamespace-to-a-xmldocument – nim

+0

感謝nim做到了!見上面的解決方案 – user3062349