Pergunta

Estou tentando ligar um Silverlight DataGrid com os resultados de uma chamada de serviço WCF. Eu não estava vendo os dados exibidos na grade, então quando eu corri através do depurador, noto que XDocument.Descendants () não estava retornando quaisquer elementos mesmo quando eu estava passando em um nome de elemento válido. Aqui é o XML que é passado de volta do serviç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>

E aqui está o método que eu uso para carregar os resultados em uma coleção de objetos anônimos, usando LINQ to XML, e depois ligam a coleção para a rede.

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

Qualquer idéia porque xml.Descendants("Employee") não retorna nada?

Obrigado!

Foi útil?

Solução

O parâmetro cadeia transmitida aos descendentes é realmente implicitamente convertido para um objeto XName. Um XName representa um nome de elemento totalmente qualificado.

O documento define um namespace "i", pois acredito que você precisa para usar o nome totalmente qualificado para o acesso do empregado. ie. i: Empregado, onde o prefixo "i:. realmente resolve a string namespace completo

Você tentou algo como:

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

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

...

Outras dicas

Você não está incluindo o namespace do elemento pai:

XNameSpace ns = "http://schemas.datacontract.org/2004/07/Employees.Entities";
foreach (XElement element in xdoc.Descendants(ns + "Employee")
{
    ...
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top