关于这段代码:
var tmpNewNode = xdoc.ImportNode(newNode, true);
if (oldNode.ParentNode != null)
{
oldNode.ParentNode.ReplaceChild(tmpNewNode, oldNode);
return true;
}
使用空的xmlns属性(xmlns="")创建了tmpNewNode。有什么建议可以避免这种情况发生吗?
谢谢
关于这段代码:
var tmpNewNode = xdoc.ImportNode(newNode, true);
if (oldNode.ParentNode != null)
{
oldNode.ParentNode.ReplaceChild(tmpNewNode, oldNode);
return true;
}
使用空的xmlns属性(xmlns="")创建了tmpNewNode。有什么建议可以避免这种情况发生吗?
谢谢
这里可能发生的情况是newNode来自没有声明命名空间的文档,但oldNode在一个有命名空间的文档中。在这种情况下,节点会将其空白命名空间带到新文档中,并显式显示出来。老实说,如果只是字符串比较的问题,直接在使用之前从XML字符串中删除所有xmlns =“”实例也不会有影响。
String.Replace
来删除xmlns=""
对我来说感觉有点尴尬,但是与在XML字符串上使用原始字符串比较一样。 - Brianxmlns=""
实际上会破坏XML文档的验证。 - user189198当我像这样创建一个 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)。
与MarkXA所说的类似:
这里可能发生的情况是,newNode来自一个没有声明命名空间的文档,但oldNode在一个有命名空间的文档中。在这种情况下,节点将其空白命名空间带到新文档中,并显式显示出来。
您可以操作字符串以进行比较,但是您DOM中的节点将无法正确命名空间限定,这可能会在以后使用时导致问题。
正确的解决方案是在第一次构建newNode时使用正确的命名空间限定。通过适当的命名空间限定,我指的是导入DOM中使用的命名空间。
尝试:
oldNode.InnerXml = tmpNewNode.InnerXml
最终我解决了打开XML文件并用空字符串替换所有xmlns ""出现的问题。
也许这不是优雅的解决方案,但它很简单且有效。
//remove void xmlns
File.WriteAllText(filename, Regex.Replace(File.ReadAllText(filename), "xmlns=\"\"", ""));
在您的 xdoc 中添加默认命名空间