Dot-Net

如何使用 .NET XML API 刪除 xmlns 屬性

  • November 16, 2015

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 屬性。顯然我可以從這個字元串表示中刪除屬性,但我想知道是否可以使用 API 做同樣的事情。

@Edit:我說的是.NET 2.0。

.NET DOM API 不支持修改元素的命名空間,而這實際上是您想要做的。因此,為了解決您的問題,您必須以一種或另一種方式建構一個新文件。您可以使用相同的 .NET DOM API 並創建一個新元素,而無需指定其命名空間。或者,您可以創建一個 XSLT 樣式表,將您原來的“命名空間”文件轉換為一個新文件,其中的元素將不是命名空間限定的。

非常感謝 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);
           }

引用自:https://stackoverflow.com/questions/76424