2011-08-09 35 views
5

Trong C# codebase của tôi, tôi có một XDocument dạng:Làm thế nào để loại bỏ thuộc tính xmlns khỏi XDocument?

<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> 

Sử dụng LINQ-to-XML hay cách khác, tôi muốn loại bỏ các xmlns cho tất cả các thành phần có yếu tố B.

Sử dụng phương pháp đưa ra ở đây: How to Remove specific attributes in XMLDocument?, tôi đã có thể loại bỏ tất cả các thuộc tính trừxmlns

Cách nào tốt nhất để loại bỏ thuộc tính 'xmlns' khỏi XDocument?

+0

thể trùng lặp của [? Làm thế nào để loại bỏ tất cả các không gian tên từ XML với C#] (http://stackoverflow.com/questions/987135/how-to -remove-all-namespaces-from-xml-with-c) – BrokenGlass

+0

Tại sao bạn muốn? Đó không phải là những thuộc tính bình thường. Chúng xác định không gian tên. –

+1

Đây không phải là bản sao. Và câu trả lời được chấp nhận là sạch hơn nhiều so với những gì được yêu cầu bởi bản sao 'có thể'. – GilliVilla

Trả lời

11

Dường như thông tin không gian tên được lưu giữ ở hai vị trí trong cây đối tượng đại diện cho tài liệu XML trong LINQ thành XML: như thuộc tính thực tế xmlns và bên trong các phần tử Name s. Nếu bạn loại bỏ nó từ cả hai nơi nó đi:

doc.Descendants() 
    .Attributes() 
    .Where(x => x.IsNamespaceDeclaration) 
    .Remove(); 

foreach (var elem in doc.Descendants()) 
    elem.Name = elem.Name.LocalName; 

(. Phần đầu của đoạn mã trên được sao chép từ câu trả lời đã được xóa bởi Bertrand Marron)

Nếu bạn muốn loại bỏ không gian tên từ các thuộc tính quá, đó là phức tạp hơn chút, vì Name của họ là read-only:

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

Vì vậy, trên thực tế lớp 'XmlDocument' không có thành viên' .Descendants() '. Tôi đoán là mã này là dành cho 'XDocument' lớp mà không phải là những gì được hỏi bởi OP. – supertopi

+0

@supertopi Câu hỏi được yêu cầu một cách rõ ràng cho LINQ to XML, đó là câu trả lời của câu trả lời này. Nhưng có, điều đó có nghĩa là 'XDocument', không phải' XmlDocument'. – svick

+0

Ok, tiêu đề có một chút gây hiểu nhầm :) Tôi sẽ đề xuất sửa đổi – supertopi

Các vấn đề liên quan