2009-03-03 9 views
15

Tôi đang cố gắng liên kết một Silverlight DataGrid với kết quả của một cuộc gọi dịch vụ WCF. Tôi đã không nhìn thấy dữ liệu được hiển thị trong lưới, vì vậy khi tôi chạy qua trình gỡ lỗi, tôi nhận thấy rằng XDocument.Descendants() không trả về bất kỳ phần tử nào ngay cả khi tôi đã chuyển vào một tên phần tử hợp lệ. Đây là XML được truyền lại từ các dịch vụ:XDocument.Descendants() không trả về bất kỳ phần tử nào

<ArrayOfEmployee xmlns="http://schemas.datacontract.org/2004/07/Employees.Entities" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"> 
    <Employee> 
    <BirthDate>1953-09-02T00:00:00</BirthDate> 
    <EmployeeNumber>10001</EmployeeNumber> 
    <FirstName>Georgi</FirstName> 
    <Gender>M</Gender> 
    <HireDate>1986-06-26T00:00:00</HireDate> 
    <LastName>Facello</LastName> 
    </Employee> 
    <Employee> 
    <BirthDate>1964-06-02T00:00:00</BirthDate> 
    <EmployeeNumber>10002</EmployeeNumber> 
    <FirstName>Bezalel</FirstName> 
    <Gender>F</Gender> 
    <HireDate>1985-11-21T00:00:00</HireDate> 
    <LastName>Simmel</LastName> 
    </Employee> 
</ArrayOfEmployee> 

Và đây là phương pháp tôi sử dụng để tải các kết quả vào một tập hợp các đối tượng mang tính chất sử dụng LINQ to XML, và sau đó gắn bộ sưu tập cho lưới điện .

void client_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs args) 
{ 
    if (args.Error != null) return; 
    var xml = XDocument.Parse(args.Result); 
    var employees = from e in xml.Descendants("Employee") 
        select new 
        { 
         EmployeeNumber = e.Element("EmployeeNumber").Value, 
         FirstName = e.Element("FirstName").Value, 
         LastName = e.Element("LastName").Value, 
         Birthday = e.Element("BirthDate").Value 
        }; 
    DataGrid.SelectedIndex = -1; 
    DataGrid.ItemsSource = employees; 
} 

Bất kỳ ý tưởng nào tại sao xml.Descendants("Employee") không trả lại bất kỳ điều gì?

Cảm ơn!

Trả lời

33

Tham số chuỗi được truyền tới Con cháu thực sự được chuyển đổi hoàn toàn thành đối tượng XName. Một XName đại diện cho một tên phần tử đủ điều kiện.

Tài liệu xác định không gian tên "i", do đó tôi tin rằng bạn cần sử dụng tên đủ điều kiện để truy cập Nhân viên. I E. i: nhân viên, nơi mà các tiền tố "i:. thực sự giải quyết vào chuỗi namespace đầy đủ

Các bạn đã thử một cái gì đó như:

XName qualifiedName = XName.Get("Employee", "http://www.w3.org/2001/XMLSchema-instance"); 

var employees = from e in xml.Descendants(qualifiedName) 

... 
+1

Bạn đã đúng, tôi cần bao gồm không gian tên. Cảm ơn bạn đã trợ giúp! –

0

Bạn chưa bao gồm không gian tên từ yếu tố phụ huynh:

XNameSpace ns = "http://schemas.datacontract.org/2004/07/Employees.Entities"; 
foreach (XElement element in xdoc.Descendants(ns + "Employee") 
{ 
    ... 
}