2009-03-03 17 views
15

Silverlight DataGridをWCFサービス呼び出しの結果にバインドしようとしています。グリッドに表示されているデータが表示されていないので、デバッガを実行したときに、有効な要素名を渡していてもXDocument.Descendants()が要素を返さないことがわかりました。ここでは、バックサービスから渡されるXMLは次のとおりです。XDocument.Descendants()が要素を返さない

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

そして、ここでは、私がXMLにLINQのを使用して、匿名オブジェクトのコレクションに結果をロードするために使用して、グリッドにコレクションをバインドする方法があります。

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

xml.Descendants("Employee")は何も返されません。

ありがとうございます!

答えて

33

Descendentsに渡される文字列パラメータは、実際には暗黙的にXNameオブジェクトに変換されます。 XNameは完全修飾要素名を表します。

文書では名前空間 "i"が定義されているため、完全修飾名を使用してEmployeeにアクセスする必要があると考えています。すなわち、 I:接頭辞「私は、従業員、:。あなたが親要素から名前空間を含むされていません

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

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

... 
+1

あなたは正しく、名前空間を含める必要がありました。 –

0

XNameSpace ns = "http://schemas.datacontract.org/2004/07/Employees.Entities"; 
foreach (XElement element in xdoc.Descendants(ns + "Employee") 
{ 
    ... 
} 
実際に完全な名前空間の文字列に解決は

は、あなたのような何かを試してみました

関連する問題