ImportNode创建了空的xmlns属性。

13

关于这段代码:

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

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

使用空的xmlns属性(xmlns="")创建了tmpNewNode。有什么建议可以避免这种情况发生吗?

谢谢


为什么xmlns属性对你来说是个问题? - John Saunders
我正在执行字符串比较。我必须避免它被生成。 - Guy
我尝试重现您的问题,但在使用ImportNode并替换后,并未创建xmlns属性。我认为问题与您创建XmlDocument的方式以及获取newNode的方式有关。建议您添加更多细节和更完整的代码图片。 - Ran
6个回答

9

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


使用String.Replace来删除xmlns=""对我来说感觉有点尴尬,但是与在XML字符串上使用原始字符串比较一样。 - Brian
同意,这有点像代码异味,但是尝试逐个节点比较两个XML树是一件很麻烦的事情,所以我可以理解为什么比较OuterXML可能更可取。 - MarkXA
1
丑陋的解决方案,但我想它能起作用...我在PowerShell中遇到了相同的问题。在我的情况下,针对Microsoft Azure API进行自动化意味着 xmlns="" 实际上会破坏XML文档的验证。 - user189198

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 就不能工作了,因为需要指定命名空间。解决方法是在这里(使用默认命名空间的 XPath)


0

MarkXA所说的类似:

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

您可以操作字符串以进行比较,但是您DOM中的节点将无法正确命名空间限定,这可能会在以后使用时导致问题。

正确的解决方案是在第一次构建newNode时使用正确的命名空间限定。通过适当的命名空间限定,我指的是导入DOM中使用的命名空间。


0

尝试:

oldNode.InnerXml = tmpNewNode.InnerXml

0

最终我解决了打开XML文件并用空字符串替换所有xmlns ""出现的问题。

也许这不是优雅的解决方案,但它很简单且有效。

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

-1

在您的 xdoc 中添加默认命名空间


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接