0

私のアプリケーションには、Silverlight クライアントから呼び出しを行う WCF REST サービスがあります。

private void btnGetEmployees_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            WebClient wClient = new WebClient();
            wClient.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wClient_OpenReadCompleted);
            wClient.DownloadStringAsync(new Uri("http://localhost/DummyService/Service.svc/EmpRest", UriKind.Absolute));
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    }

void wClient_OpenReadCompleted(object sender, DownloadStringCompletedEventArgs e)
    { 
XDocument xdStudent = XDocument.Parse(e.Result);
var Result = (from emp in xdStudent.Descendants("Employee")
                          select new Employee
                          {
                             EmpNo = emp.Element("EmpNo").Value,
                             EmpName = emp.Element("EmpName").Value
                          }
                          ).ToList();

            dgData.ItemsSource = Result;
}

e.Result から POX 結果を取得できます。以下はサンプル結果です

<ArrayOfEmployee xmlns="http://schemas.datacontract.org/2004/07/WCF_REST_Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Employee>
<EmpName>Emp_1</EmpName>
<EmpNo>101</EmpNo>
</Employee>
<Employee>
<EmpName>Emp_2</EmpName>
<EmpNo>102</EmpNo>
</Employee>
<Employee>
<EmpName>Emp_3</EmpName>
<EmpNo>103</EmpNo>
</Employee>
 <Employee>
<EmpName>Emp_4</EmpName>
<EmpNo>104</EmpNo>
</Employee>
<Employee>
<EmpName>Emp_5</EmpName>
<EmpNo>105</EmpNo>
</Employee>
</ArrayOfEmployee>

しかし、LINQ を使用して XDocument のクエリを実行すると、結果が返されません。私はテスト目的で、以下のように (サービスからではなく) XDocument を手動でロードし、値を取得できました。

string xml = @"
            <ArrayOfEmployee >
              <Employee>
                <EmpName>Emp_1</EmpName>
                <EmpNo>101</EmpNo>
              </Employee>
              <Employee>
                <EmpName>Emp_2</EmpName>
                <EmpNo>102</EmpNo>
              </Employee>
              <Employee>
                <EmpName>Emp_3</EmpName>
                <EmpNo>103</EmpNo>
              </Employee>
              <Employee>
                <EmpName>Emp_4</EmpName>
                <EmpNo>104</EmpNo>
              </Employee>
              <Employee>
                <EmpName>Emp_5</EmpName>
                <EmpNo>105</EmpNo>
              </Employee>
            </ArrayOfEmployee>";
            XDocument xdStudent = XDocument.Parse(xml); 

私が行った唯一の変更は、ルートタグから属性を削除することです

xmlns="http://schemas.datacontract.org/2004/07/WCF_REST_Service" xmlns:i="http://www.w3.org/2001/XMLSchema-instance"

LINQ を使用して XDocument をクエリしているときに、これらの属性が解析の問題を引き起こしていると思います。

4

1 に答える 1

0

あなたの問題は WCF とは無関係であり、XML 解析のみに関係しています。テスト例で削除した「属性」はドキュメントの名前空間であり、解析にはノードを識別するために名前空間が必要です。テストケースでは、完全修飾名を持つ要素ではなく、名前空間のない要素を解析するようにLinqに依頼します

http://schemas.datacontract.org/2004/07/WCF_REST_Service:Employee

したがって、テストは厳密に言えば、人生のシナリオとはまったく異なります。

Linq to XML に関するこの質問をここで見てください。

于 2012-12-28T08:53:44.337 に答える