0

在我的应用程序中,我有一个 WCF REST 服务,它从我的 silverlight 客户端进行调用。

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