创建没有名称空间声明的XML元素

我尝试将新的“PropertyGroup”元素添加到以下XML文件中

  {00AA7ECA-95A0-0000-0000-AD4D2E056BFE} Library Properties testnS testname 4B84E5C0-EC2B-4C0C-8B8E-3FAEB09F74C6   

我使用的代码如下(注意还有其他逻辑已被删除):

  XmlTextReader reader = new XmlTextReader(filename); XmlDocument doc = new XmlDocument(); doc.Load(reader); reader.Close(); XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlElement root = doc.DocumentElement; XmlNode refNode = root.SelectSingleNode("x:Project", ns); root.SelectSingleNode("Project", ns); XmlElement newElement = doc.CreateElement("PropertyGroup", "http://schemas.microsoft.com/developer/msbuild/2003"); newElement.InnerXml = "test"; root.InsertAfter(newElement, refNode); doc.Save(filename); 

这会在XML文档中生成以下新元素:

  test  

如何摆脱元素上的命名空间声明?

您需要为添加到DOM的所有元素指定XML命名空间:

 XmlNamespaceManager ns = new XmlNamespaceManager(doc.NameTable); ns.AddNamespace("x", "http://schemas.microsoft.com/developer/msbuild/2003"); XmlElement root = doc.DocumentElement; XmlNode refNode = root.SelectSingleNode("x:Project", ns); XmlElement newElement = doc.CreateElement( "PropertyGroup", "http://schemas.microsoft.com/developer/msbuild/2003"); var value = newElement.AppendChild(doc.CreateElement( "value", "http://schemas.microsoft.com/developer/msbuild/2003")); value.AppendChild(doc.CreateTextNode("test")); root.InsertAfter(newElement, refNode); 

如果你没有为任何元素这样做(或者如果你像这样使用InnerXml ),那么该元素将获得可怕的空命名空间。

发生这种情况的原因是您已通过在根节点上定义名称空间来将文档的默认名称空间定义为“ http://schemas.microsoft.com/developer/msbuild/2003 ”:

 xmlns="http://schemas.microsoft.com/developer/msbuild/2003" 

然后,您继续向文档添加一个没有名称空间的元素(’null’名称空间)。 这必须是合格的

 xmlns="" 

因为如果它不是意味着新元素在前面提到的Microsoft命名空间中 – 它不是(或者更确切地说 – 你没有被要求它)。

所以要么:

  • 您确实希望新元素位于Microsoft命名空间中 – 在这种情况下您需要这样说。 最简单的方法是使用createElement并提供命名空间,尽管您可以在InnerXml上使用xmlns属性显式地声明它(这不是添加节点的特别好方法)。

  • 您确实希望在null命名空间中使用此元素,在这种情况下,您可能更适合使用命名空间前缀限定不在null命名空间中的所有其他节点。

我怀疑你想要前者。

可以在此处找到有关命名空间的快速概述。