2011-08-29 21 views
14

Tôi có một XML đơn giản,XElement.Descendants không làm việc với namespace

<S xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><H></H></S> 

Tôi muốn tìm tất cả "H" nút.

XElement x = XElement.Parse("<S xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\"><H></H></S>"); 
IEnumerable<XElement> h = x.Descendants("H"); 
if (h != null) 
{ 
} 

Nhưng mã này không hoạt động. Khi tôi xóa không gian tên từ thẻ S, mã hoạt động chính xác.

+0

Câu hỏi này không liên quan gì đến WPF, nhân tiện ... –

+0

Cảm ơn, tôi đã xóa thẻ "WPF". –

Trả lời

42

Phần tử của bạn có không gian tên vì xmlns đặt không gian tên mặc định cho phần tử đó và phần tử con của nó. Hãy thử điều này thay vì:

XNamespace ns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation"; 
IEnumerable<XElement> h = x.Descendants(ns + "H"); 

Lưu ý rằng Descendants sẽ không bao giờ trở lại null, do điều kiện ở phần cuối của mã của bạn là vô nghĩa.

Nếu bạn muốn tìm tất cảH yếu tố không phụ thuộc không gian tên, bạn có thể sử dụng:

var h = x.Descendants().Where(e => e.Name.LocalName == "H"); 
+0

Cảm ơn và chúc mừng tốt đẹp nhất. –

6

Chỉ muốn thêm vào câu trả lời của Jon mà bạn có thể có được không gian tên như thế này:

XNamespace ns = x.Name.Namespace 

Sau đó, chỉ cần sử dụng nó như ông đã đề xuất:

IEnumerable<XElement> h = x.Descendants(ns + "H"); 
Các vấn đề liên quan