2009-11-25 381 views
3

我有一個XML文件如下:改變XML命名空間

<?xml version="1.0" encoding="utf-8"?> 
<ABC version="1" xmlns="urn:Company"> 
</ABC> 

我發佈版本2和命名空間改爲「NewCompany」。 你如何更新命名空間?

我試圖

XmlDocument的XMLDOCUMENT =新的XmlDocument();使用(XmlReader xmlReader = XmlReader.Create(「myfile.xml」)) { xmlDocument.Load(xmlReader); }

 XmlNodeList nodeList = xmlDocument.GetElementsByTagName("ABC"); 
     if (nodeList.Count == 1) 
     { 
      XmlElement element = nodeList.Item(0) as XmlElement; 
      if (element != null) 
      { 
       element.SetAttribute("xmlns", "NewCompany"); 

       XmlWriterSettings settings = new XmlWriterSettings(); 
       settings.Indent = true; 
       using (XmlWriter writer = XmlWriter.Create("myfile.xml", settings)) 
       { 
        xmlDocument.WriteTo(writer); 
       } 
      } 
     } 

,但我得到 「前綴‘’不能從相同的開始元素標記中被重新定義。」 例外

回答

0

我今天遇到這個,發現一個解決方法。如果您使用XmlTextWriter而不是XmlWriter,問題就會消失。您的代碼示例會是這個樣子:

XmlNodeList nodeList = xmlDocument.GetElementsByTagName("ABC"); 
    if (nodeList.Count == 1) 
    { 
     XmlElement element = nodeList.Item(0) as XmlElement; 
     if (element != null) 
     { 
      element.SetAttribute("xmlns", "NewCompany"); 

      using (XmlTextWriter writer = new XmlTextWriter("myfile.xml", Encoding.UTF8)) 
      { 
       writer.Formatting = Formatting.Indented; 
       xmlDocument.WriteTo(writer); 
      } 
     } 
    } 

我會想到,XmlWriter.Create只會返回一個XmlTextWriter的,但是這似乎並不如此。從在Reflector中查看,XmlWriter.Create似乎從XmlTextWriter返回具體類型不同

XmlTextWriter似乎支持更改文檔元素的命名空間,而由XmlWriter.Create返回的作家不支持。

我意識到這個問題已經四年了,但也許我的回答會幫助別人。