2010-12-02 67 views
8

改编职系此代码:ImportNode创建空xmlns属性

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

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

tmpNewNode与空xmlns属性(的xmlns = “”)创建。任何建议如何避免它?

10X

+0

为什么xmlns属性是您的问题? – 2010-12-02 22:08:58

+0

我正在执行字符串比较。我必须避免它被生成。 – Guy 2010-12-05 07:30:59

回答

8

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

-1

添加默认的命名空间到你的XDOC

0

沿着什么MarkXA said行:

什么可能发生在这里的是, newNode来自一个文件,没有 命名空间中声明,但oldNode是 一个带有命名空间的文档。在此 的情况下,该节点将其空白 命名空间切换到新文档,并将 明确显示。

为了比较的目的,您可以操纵字符串,但DOM中的节点不能正确地命名空间,如果您尝试使用它,可能会导致以后出现问题。

正确的解决方案是首先构建具有适当名称空间限定的newNode。通过propery命名空间限定,我的意思是在导入DOM中使用的命名空间。

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)

0

尝试:

oldNode.InnerXml = tmpNewNode.InnerXml 
0

最后我解决了这个开放的XML文件,并用空字符串替换的xmlns“”所有ocurrences。

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

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