c# - - - 如何將XML命名空間提升到root元素

如果我有一個包含命名空間的XML文件,如:


<root>



<h:table xmlns:h="http://www.namespaces.com/namespaceOne">


 <h:tr>


 <h:td>Apples</h:td>


 <h:td>Bananas</h:td>


 </h:tr>


</h:table>



<h:table xmlns:h="https://www.namespaces.com/namespaceTwo">


 <h:name>African Coffee Table</f:name>


 <h:width>80</f:width>


 <h:length>120</f:length>


</h:table>



</root>



我想將所有名稱空間提升到root元素,如下所示:


<root xmlns:h="http://www.namespaces.com/namespaceOne" xmlns:h1="https://www.namespaces.com/namespaceTwo">



<h:table>


 <h:tr>


 <h:td>Apples</h:td>


 <h:td>Bananas</h:td>


 </h:tr>


</h:table>



<h1:table>


 <h1:name>African Coffee Table</f:name>


 <h1:width>80</f:width>


 <h1:length>120</f:length>


</h1:table>



</root>



有什麼方法可以做到?

时间:

這非常簡單:


var doc = XDocument.Parse(xml);


var namespaceAttributes = doc.Descendants()


 .SelectMany(x => x.Attributes())


 .Where(x => x.IsNamespaceDeclaration);


int count = 1;


foreach (var namespaceAttribute in namespaceAttributes)


{


 doc.Root.Add(new XAttribute(XNamespace.Xmlns + $"h{count}", namespaceAttribute.Value));


 namespaceAttribute.Remove();


 count++;


}



我們遍歷所有名稱空間聲明(xmlns:foo="foo" ),對於我們找到的每個名稱空間屬性,我們在root元素上放置一個URL相同的名稱空間屬性,並刪除這個屬性。

注意,這不會摺疊有相同URL的多個名稱空間(例如,如果你有兩個xmlns:h="https://www.namespaces.com/namespaceOne"在不同的孩子身上),如果你想這樣做,只需保留一個已添加到根元素的名稱空間列表,

...