ImportNode创建空xmlns属性

重新代码:

var tmpNewNode = xdoc.ImportNode(newNode, true); if (oldNode.ParentNode != null) { oldNode.ParentNode.ReplaceChild(tmpNewNode, oldNode); return true; } 

使用空xmlns属性(xmlns =“”)创建tmpNewNode。 有什么建议我怎么能避免呢?

10倍

这里可能发生的是newNode来自没有声明名称空间的文档,但oldNode位于带有名称空间的文档中。 在这种情况下,节点将其空白名称空间转移到新文档,并显式显示。 说实话,如果它只是字符串比较的问题,那么在使用它之前从XML字符串中删除xmlns =“”的所有实例都不会有什么坏处。

按照MarkXA的说法 :

这里可能发生的是newNode来自没有声明名称空间的文档,但oldNode位于带有名称空间的文档中。 在这种情况下,节点将其空白名称空间转移到新文档,并显式显示。

您可以操作String以进行比较,但DOM中的节点不能正确命名空间,如果您尝试使用它可能会导致以后出现问题。

正确的解决方案是首先使用适当的命名空间限定来构建newNode。 通过命名空间限定,我指的是导入DOM中使用的命名空间。

当我像这里创建一个XmlElement时,我遇到了同样的问题

 XmlElement xmlElement = myXmlDocument.CreateElement("MyElemenent"); myXmlDocument.AppendChild(xmlElement); 

在此之后,我在保存后获得了属性xmlns =“”。

如果我使用文档的命名空间,我可以抑制此xmlns属性。

 XmlElement xmlElement = myXmlDocument.CreateElement("MyElemenent",myXmlDocument.DocumentElement.NamespaceURI); myXmlDocument.AppendChild(xmlElement); 

没有空的xmlns =“”我的SelectNodes不再工作,因为需要指定命名空间。 此处的解决方案(使用-xpath-with-default-namespace)

尝试:

 oldNode.InnerXml = tmpNewNode.InnerXml 

最后,我解决了这个打开的xml文件,并用空字符串替换xmlns“”的所有发生。

也许它不是优雅的解决方案,但它简单,工作正常。

 //remove void xmlns File.WriteAllText(filename, Regex.Replace(File.ReadAllText(filename), "xmlns=\"\"", "")); 

将默认命名空间添加到xdoc