重新使用此代码:
var tmpNewNode = xdoc.ImportNode(newNode, true);
if (oldNode.ParentNode != null)
{
oldNode.ParentNode.ReplaceChild(tmpNewNode, oldNode);
return true;
}
使用空xmlns属性(xmlns =“”)创建tmpNewNode。有什么建议我可以避免吗?
10倍
答案 0 :(得分:8)
这里可能发生的事情是newNode来自没有声明名称空间的文档,但oldNode位于带有名称空间的文档中。在这种情况下,节点将其空白名称空间转移到新文档,并显式显示。说实话,如果它只是字符串比较的问题,那么在使用它之前从XML字符串中删除xmlns =“”的所有实例都不会有什么坏处。
答案 1 :(得分:0)
这里可能发生的是 newNode来自一个没有的文件 声明了名称空间,但是oldNode在 带有命名空间的文档。在这 情况,节点空白 命名空间到新文档和 它明确地显示出来。
您可以操作String以进行比较,但DOM中的节点不能正确命名空间,如果您尝试使用它可能会导致以后出现问题。
正确的解决方案是首先使用正确的命名空间限定来构建newNode。通过命名空间限定,我指的是导入DOM中使用的命名空间。
答案 2 :(得分:0)
当我创建像这里的XmlElement时,我遇到了同样的问题
XmlElement xmlElement = myXmlDocument.CreateElement("MyElemenent");
myXmlDocument.AppendChild(xmlElement);
在此之后,我在保存后得到了属性xmlns =“”。
如果我使用文档的命名空间,我可以禁止这个xmlns属性。
XmlElement xmlElement = myXmlDocument.CreateElement("MyElemenent",myXmlDocument.DocumentElement.NamespaceURI);
myXmlDocument.AppendChild(xmlElement);
没有空的xmlns =“”我的SelectNodes不再工作,因为需要指定命名空间。解决方案是here (using-xpath-with-default-namespace)
答案 3 :(得分:0)
尝试:
oldNode.InnerXml = tmpNewNode.InnerXml
答案 4 :(得分:0)
最后我解决了这个开放的xml文件,并用空字符串替换xmlns“”的所有发生。
也许它不是优雅的解决方案,但它简单而且工作正常。
//remove void xmlns
File.WriteAllText(filename, Regex.Replace(File.ReadAllText(filename), "xmlns=\"\"", ""));
答案 5 :(得分:-1)
将默认命名空间添加到xdoc