如何使用.NET XML API删除xmlns属性

时间:2020-03-05 18:57:02  来源:igfitidea点击:

XmlElement.Attributes.Remove *方法适用于任意属性,导致从XmlDocument.OuterXml属性中删除了已删除的属性。 Xmlns属性却不同。这是一个例子:

XmlDocument doc = new XmlDocument();
doc.InnerXml = @"<Element1 attr1=""value1"" xmlns=""http://mynamespace.com/"" attr2=""value2""/>";
doc.DocumentElement.Attributes.RemoveNamedItem("attr2");
Console.WriteLine("xmlns attr before removal={0}", doc.DocumentElement.Attributes["xmlns"]);
doc.DocumentElement.Attributes.RemoveNamedItem("xmlns");
Console.WriteLine("xmlns attr after removal={0}", doc.DocumentElement.Attributes["xmlns"]);

结果输出是

xmlns attr before removal=System.Xml.XmlAttribute
xmlns attr after removal=
<Element1 attr1="value1" xmlns="http://mynamespace.com/" />

该属性似乎已从Attributes集合中删除,但并未从XmlDocument.OuterXml中删除。
我猜这是因为该属性的特殊含义。

问题是如何使用.NET XML API删除xmlns属性。
显然,我可以从String表示形式中删除该属性,但是我想知道是否可以使用API​​进行相同的操作。

@Edit:我正在谈论.NET 2.0。

解决方案

回答

是的,因为它是ELEMENT名称,所以我们不能显式删除它。使用XmlTextWriter的WriteStartElement和WirteStartAttribute并将属性替换为空白可能会完成工作。

我正在检查。将更新。

回答

也许通过XmlNamespaceManager? http://msdn.microsoft.com/zh-cn/library/system.xml.xmlnamespacemanager.removenamespace.aspx,但这只是一个猜测。

回答

.NET DOM API不支持修改元素的名称空间,这实际上是我们要尝试执行的操作。因此,为了解决问题,我们必须以一种或者另一种方式构造一个新文档。我们可以使用相同的.NET DOM API并创建一个新元素,而无需指定其名称空间。另外,我们可以创建一个XSLT样式表,该样式表将原始的"命名空间"文档转换为新的样式,其中的元素将不符合命名空间要求。

回答

这不是应该删除名称空间吗?

XmlNamespaceManager mgr = new XmlNamespaceManager("xmlnametable");
mgr.RemoveNamespace("prefix", "uri");

但是无论如何,System.Xml.Linq命名空间(.Net 3.0)中的XElement,XDocument和XNameSpace类比旧的XmlDocument模型要好得多。搏一搏。我上瘾了。

回答

我们可以将xml转换为字符串,从该字符串中删除xmlns,然后使用该字符串创建另一个XmlDocument,该字符串将不具有名称空间。

回答

我看到了该线程中的各种选项,并开始解决自己的解决方案,以删除xml中的xmlns属性。这工作正常,没有问题:

'Remove the Equifax / Transunian / Experian root node attribute that have xmlns and load xml without xmlns attributes.
If objXMLDom.DocumentElement.NamespaceURI <> String.Empty Then
  objXMLDom.LoadXml(objXMLDom.OuterXml.Replace(objXMLDom.DocumentElement.NamespaceURI, ""))
  objXMLDom.DocumentElement.RemoveAllAttributes()
  ResponseXML = objXMLDom.OuterXml
End If

无需执行其他任何操作即可从xml中删除xmlns。

回答

非常感谢Ali Shah,该线程完美解决了我的问题!
这是C转换:

var dom = new XmlDocument();
        dom.Load("C:/ExampleFITrade.xml));
        var loaded = new XDocument();
        if (dom.DocumentElement != null)
            if( dom.DocumentElement.NamespaceURI != String.Empty)
            {
                dom.LoadXml(dom.OuterXml.Replace(dom.DocumentElement.NamespaceURI, ""));
                dom.DocumentElement.RemoveAllAttributes();
                loaded = XDocument.Parse(dom.OuterXml);
            }