2011-08-09 136 views
5

在我的C#代碼庫,我有以下形式的XDocument如何從XDocument中刪除xmlns屬性?

<A> 
<B> 
    <C xmlns='blabla' yz='blablaaa'> Hi </C> 
    <D xmlns='blabla' yz='blablaaa'> How </D> 
    <E xmlns='blabla' yz='blablaaa'> Are </E> 
    <F xmlns='blabla' yz='blablaaa'> You </F> 
</B> 
<B> 
    <C xmlns='blabla' yz='blablaaa'> I </C> 
    <D xmlns='blabla' yz='blablaaa'> am</D> 
    <E xmlns='blabla' yz='blablaaa'> fine</E> 
    <F xmlns='blabla' yz='blablaaa'> thanks</F> 
</B> 

使用LINQ到XML或以其他方式,我想刪除xmlns對所有元素B.包含的元素

使用這裏給出的方法:How to Remove specific attributes in XMLDocument?,我能夠刪除所有屬性除了xmlns

XDocument中刪除'xmlns'屬性的最佳方法是什麼?

+0

可能重複[?如何從XML與C#中刪除所有命名空間(http://stackoverflow.com/questions/987135/how-to -remove-all-namespaces-from-xml-with-c) – BrokenGlass

+0

爲什麼你想要?這些不是正常的屬性。他們定義了命名空間。 –

+1

這不是重複的。接受的答案比'可能的'重複要求要乾淨得多。 – GilliVilla

回答

11

似乎命名空間信息保存在表示LINQ to XML中的XML文檔的對象樹中的兩個位置:作爲實際的xmlns屬性和元素的內部Name s。如果兩地刪除它的消失:

​​

如果你想移除屬性命名空間太(上面的代碼是從伯特蘭·馬龍現在刪除答案複製的第一部分)這是更復雜一點,因爲他們Name是隻讀的:

foreach (var attr in doc.Descendants().Attributes()) 
{ 
    var elem = attr.Parent; 
    attr.Remove(); 
    elem.Add(new XAttribute(attr.Name.LocalName, attr.Value)); 
} 
+0

所以實際上'XmlDocument'類沒有'.Descendants()'成員。我的猜測是這個代碼是針對'XDocument'類的,而不是OP所要求的。 – supertopi

+0

@supertopi明確要求提供LINQ to XML的問題,這是該答案的用途。但是,是的,這意味着它是'XDocument',而不是'XmlDocument'。 – svick

+0

好吧,標題有點誤導:)我會提出一個修改 – supertopi