C# - Carregando XML com LINQ
Hoje veremos como carregar dados XML para realizar operações com LINQ to XML.

Podemos usar os métodos estáticos da classe System.Xml.Linq.XElement para tratar dados XML existente.

Se pensarmos em um documento XML como uma hierarquia de nós podemos encontrar os seguintes tipos de nós e de seus nós filhos em um documento XML:

Tipo de Nó Descrição Nós Filhos possíveis
Document Representa o documento XML Element (max. one), ProcessingInstruction, Comment, DocumentType
DocumentFragment Representa um documento uma porção do documento. Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
DocumentType Fornece uma interface para as entidades definidas para o documento. Nenhum
ProcessingInstruction Representa uma instrução de processamento. Nenhum
EntityReference Representa uma referencia de entidade Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
Element Representa um elemento Element, Text, Comment, ProcessingInstruction, CDATASection, EntityReference
Attr Representa um atributo. Text, EntityReference
Text Representa um conteúdo textual em um elemento ou atributo. Nenhum
CDATASection Representa uma seção CDATA Nenhum
Comment Representa um comentário Nenhum
Entity Representa uma entidade Element, ProcessingInstruction, Comment, Text, CDATASection, EntityReference
Notation Representa uma notação declarada em um DTD Nenhum
Whitespace Espaço em branco entre a marcação. Nenhum
EndElement Nós EndElement são retornados ao final de um elemento. Nenhum
XmlDeclaration O nó XmlDeclaration deve ser o primeiro nó no documento.Ele não pode ter filhos.Ele é um filho do nó Document
Ele pode ter atributos que provém versão e a codificação de informações.
Nenhum
Notation Um nó de Notation não pode ter nenhum nó filho.Ele poderá aparecer como o filho do nó DocumentType Nenhum

Com base nisso uma das maneiras de obtermos informação de um arquivo XML é ler sequencialmente o arquivo e identifica qual o tipo de e Nó filho o elemento possui extraindo a informação desejada.

Para inspecionar os nós usamos a enumeração NodeType que determina qual o tipo de podendo obter o nome do (elementos/atributos) usando a propriedade Name e o seu valor através da propriedade Value.

A classe System.Xml.Linq.XElement representa um elemento XML, e a LINQ representa o XML como uma árvore de
XElements, de modo que esta classe pode ser usada para todos os elementos a partir dos nós raiz aos nós filho final.

O método estático XElement.Load carregará e analisará um documento XML de várias fontes, retornando uma instância do XElement representando o nó raiz.

O método Load está sobrecarregado para suporta uma variedade de fontes de dados, conforme mostrado na tabela a seguir:

Método Descrição
Load(Stream) Carrega os dados XML do stream
Load(String) Carrega os dadaos XML de um arquivo a partir do nome da string
Load(TextReader) Carrega os dados XML a partir de um System.IO.TextReader
Load(XmlReader) Carrega os dados XML a partir de um System.Xml.XmlReader

Você pode controlar algumas das opções de carregamento usando a enumeração System.Xml.Linq.LoadOptions
como um argumento adicional para o método Load.

As opções disponíveis são:

None  0   Não preserva espaço em branco insignificante ou carrega o URI de base e as informações de linha.
PreserveWhitespace 1 Preserva todo espaço em branco insignificante durante a análise.
SetBaseUri 2 Solicita as informações de URI de base do XmlReader e disponibiliza por meio da propriedade BaseUri.
SetLineInfo 4 Solicita as informações de linha do XmlReader  e disponibiliza por meio das propriedades em XObject.

A seguir veremos um exemplo que mostra o uso de quatro diferentes fontes de dados XML aceitas pelo método Load.

recursos usados:

  • Visual Basic 2019 Community Edition

Criando o projeto C# no VS 2019

Crie um projeto Console do tipo .NET Core chamado CShp_TrataXml1;

Vamos criar uma pasta chamada XML na raiz do projeto e nesta pasta vamos criar o arquivo xml chamado CatalogoProdutos.xml com o código abaixo:

<?xml version="1.0" encoding="utf-8" ?> 
<catalogoProdutos>
  <catalogoNome>Jcm Soft Catalogo de Produtos</catalogoNome>
  <dataValidade>30-12-2011</dataValidade>
  <produtos>
    <produto id="1001">
      <produtoNome>Super DVD .NET</produtoNome>
      <descricao>Quase tudo para VB .NET , C# e ASP .NET.</descricao>
      <produtoPreco>60.00</produtoPreco>
      <estoque>true</estoque>
    </produto>
    <produto id="1002">
      <produtoNome>Super CD Visual Basic</produtoNome>
      <descricao>Quase tudo para Visual Basic.</descricao>
      <produtoPreco>50.00</produtoPreco>
      <estoque>true</estoque>
    </produto>
  </produtos>
</catalogoProdutos>

No método Main da classe Program vamos incluir o código a seguir :

using System;
using System.IO;
using System.Xml;
using System.Xml.Linq;
namespace CShp_TrataXml1
{
    class Program
    {
        static void Main(string[] args)
        {
            //define o nome do arquivo e seu caminho na pasta XML do projeto
            string nomeArquivo = @"CatalogoProdutos.xml";
            string diretorioAtual = Path.GetFullPath(@"..\..\..\");
            string caminhoArquivoXML = Path.Combine(diretorioAtual, "XML", nomeArquivo);
            // carrega o XML usando o nome do arquivo
            Console.WriteLine("Carregando XML usando o nome do arquivo");
            XElement root = XElement.Load(caminhoArquivoXML);
            Console.WriteLine(root);
            Console.ReadLine();
            // stream 
            Console.WriteLine("Carregando XML usando um stream");
            FileStream filestream = File.OpenRead(caminhoArquivoXML);
            root = XElement.Load(filestream);
            Console.WriteLine(root);
            Console.ReadLine();
            // textreader.
            Console.WriteLine("Carregando XML usando um TextReader");
            TextReader reader = new StreamReader(caminhoArquivoXML);
            root = XElement.Load(reader);
            Console.WriteLine(root);
            Console.ReadLine();
            // xmlreader.
            Console.WriteLine("Carregando XML usando um XmlReader");
            XmlReader xmlreader = new XmlTextReader(new StreamReader(caminhoArquivoXML));
            root = XElement.Load(xmlreader);
            Console.WriteLine(root);
            Console.ReadLine();
        }
    }
}

Executando o projeto teremos:

Pegue o código do projeto aqui:  CShp_TrataXml1.zip

"Portanto, não te envergonhes do testemunho de nosso Senhor, nem de mim, que sou prisioneiro seu; antes participa das aflições do evangelho segundo o poder de Deus,
Que nos salvou, e chamou com uma santa vocação; não segundo as nossas obras, mas segundo o seu próprio propósito e graça que nos foi dada em Cristo Jesus antes dos tempos dos séculos;"
2 Timóteo 1:8,9

Referências:


José Carlos Macoratti