我目前正在编写一段代码,旨在从 XML 文档中删除所有名称空间并将它们重新添加到标题中。我们使用它是因为我们摄取了非常大的 xml 文档,然后以小片段的形式重新提供它们,因此每个项目都需要复制父文档中的命名空间。
XML 首先作为 XmlDocument 加载,然后传递给删除命名空间的函数:
_fullXml = new XmlDocument();
_fullXml.LoadXml(itemXml);
RemoveNamespaceAttributes(_fullXml.DocumentElement);
remove 函数遍历整个文档以查找名称空间并删除它们。它看起来像这样:
private void RemoveNamespaceAttributes(XmlNode node){
if (node.Attributes != null)
{
for (int i = node.Attributes.Count - 1; i >= 0; i--)
{
if (node.Attributes[i].Name.Contains(':') || node.Attributes[i].Name == "xmlns")
node.Attributes.Remove(node.Attributes[i]);
}
}
foreach (XmlNode n in node.ChildNodes)
{
RemoveNamespaceAttributes(n);
}
}
但是,我发现它不起作用——它使所有命名空间保持不变。
如果您使用调试器遍历代码,那么它看起来正在做它应该做的事情 - 节点对象的名称空间属性被删除。但是原始的 _fullXml 文档保持不变。我认为这是因为该函数正在查看传递给它的数据的克隆,而不是原始数据。
所以我的第一个想法是通过 ref 传递它。但我不能这样做,因为 foreach 循环内函数的迭代部分有一个编译错误——你不能通过引用传递对象 n。
第二个想法是传递整个 _fullXml 文档,但这也不起作用,猜测是因为它仍然是一个克隆。
所以看起来我需要解决通过 ref 传递文档然后遍历节点以删除所有命名空间的问题。这显然需要重新设计这个代码片段,但我看不到一个好的方法。任何人都可以帮忙吗?
干杯,马特