ImportNode创建空xmlns属性

时间:2010-12-02 15:02:29

标签: c# .net xml xmldocument

重新使用此代码:

   var tmpNewNode = xdoc.ImportNode(newNode, true);

    if (oldNode.ParentNode != null)
    {
        oldNode.ParentNode.ReplaceChild(tmpNewNode, oldNode);
        return true;
    }
使用空xmlns属性(xmlns =“”)创建

tmpNewNode。有什么建议我可以避免吗?

10倍

6 个答案:

答案 0 :(得分:8)

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

答案 1 :(得分:0)

MarkXA said

一致
  

这里可能发生的是   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