Partilhar via


Como depurar conjuntos de resultados de consulta vazios (LINQ to XML)

Um dos problemas mais comuns ao consultar árvores XML é que, se a árvore XML tiver um namespace padrão, o desenvolvedor às vezes grava a consulta como se o XML não estivesse em um namespace.

O primeiro conjunto de exemplos neste artigo mostra uma maneira típica que o XML em um namespace padrão é carregado e, em seguida, consultado incorretamente.

O segundo conjunto de exemplos mostra as correções necessárias para que você possa consultar XML em um namespace.

Para obter mais informações, consulte Visão geral de namespaces.

Exemplo: uma consulta imprópria em XML em um namespace

Este exemplo mostra a criação de XML em um namespace e uma consulta que retorna um conjunto de resultados vazio.

XElement root = XElement.Parse(
@"<Root xmlns='http://www.adventure-works.com'>
    <Child>1</Child>
    <Child>2</Child>
    <Child>3</Child>
    <AnotherChild>4</AnotherChild>
    <AnotherChild>5</AnotherChild>
    <AnotherChild>6</AnotherChild>
</Root>");
IEnumerable<XElement> c1 =
    from el in root.Elements("Child")
    select el;
Console.WriteLine("Result set follows:");
foreach (XElement el in c1)
    Console.WriteLine((int)el);
Console.WriteLine("End of result set");
Dim root As XElement = _
    <Root xmlns='http://www.adventure-works.com'>
        <Child>1</Child>
        <Child>2</Child>
        <Child>3</Child>
        <AnotherChild>4</AnotherChild>
        <AnotherChild>5</AnotherChild>
        <AnotherChild>6</AnotherChild>
    </Root>
Dim c1 As IEnumerable(Of XElement) = _
        From el In root.<Child> _
        Select el
Console.WriteLine("Result set follows:")
For Each el As XElement In c1
    Console.WriteLine(el.Value)
Next
Console.WriteLine("End of result set")

O exemplo produz este resultado:

Result set follows:
End of result set

Exemplo: Uma consulta adequada em XML em um namespace

Este exemplo mostra a criação de XML em um namespace e uma consulta codificada corretamente.

A solução é declarar e inicializar um XNamespace objeto e usá-lo ao especificar XName objetos. Neste caso, o argumento para o Elements método é um XName objeto.

XElement root = XElement.Parse(
@"<Root xmlns='http://www.adventure-works.com'>
    <Child>1</Child>
    <Child>2</Child>
    <Child>3</Child>
    <AnotherChild>4</AnotherChild>
    <AnotherChild>5</AnotherChild>
    <AnotherChild>6</AnotherChild>
</Root>");
XNamespace aw = "http://www.adventure-works.com";
IEnumerable<XElement> c1 =
    from el in root.Elements(aw + "Child")
    select el;
Console.WriteLine("Result set follows:");
foreach (XElement el in c1)
    Console.WriteLine((int)el);
Console.WriteLine("End of result set");
Imports <xmlns="http://www.adventure-works.com">

Module Module1
    Sub Main()
        Dim root As XElement = _
            <Root xmlns='http://www.adventure-works.com'>
                <Child>1</Child>
                <Child>2</Child>
                <Child>3</Child>
                <AnotherChild>4</AnotherChild>
                <AnotherChild>5</AnotherChild>
                <AnotherChild>6</AnotherChild>
            </Root>
        Dim c1 As IEnumerable(Of XElement) = _
                From el In root.<Child> _
                Select el
        Console.WriteLine("Result set follows:")
        For Each el As XElement In c1
            Console.WriteLine(CInt(el))
        Next
        Console.WriteLine("End of result set")
    End Sub
End Module

O exemplo produz este resultado:

Result set follows:
1
2
3
End of result set

Consulte também