2009-11-25 105 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返回的作家不支持。

我意识到这个问题已经四年了,但也许我的回答会帮助别人。