Hoje veremos como carregar dados XML para realizar operações com LINQ to XML. |
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 Nó 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 Nó podendo obter o nome do Nó (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:
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:
C# - Acessando e Lendo arquivos XML recursivamente - Macoratti.net
ASP .NET Core 2.0 - Iniciando com NET CLI e VS Code - Macoratti.net