LINQ To XML

by Fabiano 15. maio 2008 01:07

 

Olá pessoal como tinha dito vamos fazer uma serie de artigos falando de LINQ, mês passado falei sobre sua teoria geral e nos aprofundamos mais no LINQ To SQL, este mês vamos falar mais sobre o LINQ To XML que uma ferramenta muito útil para trabalhar com XML, pra que já manipulou XML seja no Asp 3.0, ou ate mesmo nas versões anteriores do .NET  vai notar o quando esta ferramenta facilita nossa vida.

O LINQ TO XML

O LINQ to XML é um provedor de dados LINQ que é implementado no namespace System.Xml.LINQ a partir da versão 3.5 da plataforma .NET. Ele fornece um modelo de programação que permite ler, construir e escrever dados XML. Você pode usar LINQ To XML para realizar consultas LINQ sobre dados no formato XML que podem ser retornados do arquivo de sistemas, de uma URL HTTP remota, de um web service ou partir de qualquer XML em memória existente.

O LINQ To XML fornece mais recursos e facilidades para tratar com XML do que a API presente no namespace System.XML(XmlReader/XmlWriter) da versão anterior da plataforma .NET, sendo também mais eficiente, por usar menos memória, que a API DOM do XmlDocument fornece.

O conceito de documento XML é fundamental no DOM e os nós XML são criados no contexto do documento XML, se você desejar usar um elemento através de múltiplos documentos vai precisar importar os nós através do documento. O LINQ To XML simplifica essa abordagem.

No LINQ to XML você pode criar elementos XML diretamente: Ex:
XElement documentoXml = new XElement("Clientes"); 

Criando documentos XML

Para criar um arquivo XML vamos utilizar a classe XElement .Todos os atributos e elementos serão criados com os métodos SetAttributeValue e SetElementValue, para salvar o arquivo a classe disponibiliza o método Save.

Conforme o código abaixo adicione o método CriaXML

private void CriaXML()

    {

 

        XElement xml = new XElement("Clientes",

                    new XElement("Cliente",

                        new XAttribute("CliID", "1"),

                        new XElement("Nome", "Fabiano Belmonte"),

                        new XElement("Email", "fbelmonte@etniax.com.br")

                    ),

                    new XElement("Cliente",

                        new XAttribute("CliID", "2"),

                        new XElement("Nome", "Juca das Neves"),

                        new XElement("Email", "juca@bol.com.br")

                    )

                );

 

        xml.Save("c:\\xmlClientes.xml");

    }

Veja o Resultado:

<?xml version="1.0" encoding="utf-8"?>

<Clientes>

  <Cliente CliID="1">

    <Nome>Fabiano Belmonte</Nome>

    <Email>fbelmonte@etniax.com.br</Email>

  </Cliente>

  <Cliente CliID="2">

    <Nome>Juca das Neves</Nome>

    <Email>juca@bol.com.br</Email>

  </Cliente>

</Clientes>

 

Como e simples criar um arquivo XML e salva-lo no disco, note que não precisamos de nenhum outro namespace fizemos tudo pelo System.Xml.LINQ

Carregar arquivo XML

Para carregar e selecionar valores utilizando Linq to XML podemos utilizar a classe XElement. Método Load: carregar conteúdo XML de um arquivo ou da memórias, em uma de suas sobrecargas podemos passar o caminho do arquivo XML , as outras sobrecargas recebe como parâmetros um objeto TextReader ou XmlReader.Você também pode definir opções à partir do enum LoadOptions.

O LoadOption possui quatro opções . None : todas as linhas desnecessárias,linhas em branco e linhas de informações, do arquivo XML não serão carregadas. PreserveWhitespace: essa opção define que todas as linhas em branco do arquivo XML serão preservadas. SetBaseUri : essa opção define o preenchimento da propriedade BaseUri. SetLineInfo: essa opção habilita o preenchimento da das informações de linha, essa informações pode ser recuperadas através da interface IXmlLineInfo.

Conforme código abaixo adicione o método CarregaXml

private void CarregaXml()

    {

        XElement xml = XElement.Load("c:\\xmlClientes.xml", LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);

 

        //Mostra o caminho base.  

        Response.Write("Caminho :" + xml.BaseUri);

 

        //Mostra informações de linha   

        IXmlLineInfo lineInfo = xml as IXmlLineInfo;

        Response.Write(" <br> LineNumber " + lineInfo.LineNumber + "e LinePosition: " + lineInfo.LinePosition);

 

        //Carrega todos os elementos dentro do elemento root  

        IEnumerable<XElement> enumerable = xml.Elements();

 

        //Mostra todos os elementos dentro do elemento root  

        Response.Write("<br> Mostra todos os elementos dentro do elemento root <br>");

        foreach (var item in enumerable)

            Response.Write(item + "<br>");

 

        //Mostra todos os atributos nome do elento Cliente

        Response.Write("<br> Mostra todos os atributos nome do elento Cliente <br>");

        foreach (var item in enumerable.Attributes("CliID"))

            Response.Write(item + "<br>");

 

        //Mostra todos os elementos CPF dentro do elemento Cliente  

        Response.Write(" <br> Mostra todos os elementos Email dentro do elemento Cliente <br> ");

        foreach (var item in enumerable.Elements("Email"))

            Response.Write(item + "<br>");

    }

Alterando valores

Para isso utilizamos todo o poder do Linq para selecionar o atributo ou elemento que desejamos alterar.

Conforme o código abaixo adicione o método AlterandoValores

private void AlterandoValores()

    {

        XElement xml = XElement.Load("c:\\xmlClientes.xml", LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);

        IEnumerable<XElement> elements = xml.Elements();

 

       

        foreach (var item in elements.Elements("Nome").Where(e => e.Value == "Fabiano Belmonte"))

            item.Value = "Adriano Jose";

 

 

        foreach (var item in elements.Attributes("CliID").Where(e => e.Value == "1"))

            item.Value = "12";

 

        //Salva Alterações  

        xml.Save("c:\\xmlClientes.xml");

    }

Excluindo Valores

Agora vamos excluir um elemento de dentro de um XML, utilizaremos o mesmo conceito onde retiramos um elemento que possua o atributo passado veja como e simples.

 

Conforme o código abaixo adicione o método ExcluindoValores

private void ExcluindoValores()

    {

        XElement xml = XElement.Load("c:\\xmlClientes.xml", LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);

        IEnumerable<XElement> elements = xml.Elements();

 

        elements.AncestorsAndSelf("Cliente").Where(e => e.Attribute("CliID").Value == "2").Remove();

 

        //Salva Alterações  

        xml.Save("c:\\xmlClientes.xml");

    }

Inserindo Elementos

Para inserir elementos em um XML, também e muito simples precisamos primeiramente fazer o load no XML, em seguida criar um novo elemento e adicionar no XML Conforme o código abaixo adicione o método InsereElemento

private void InsereElemento()

    {

 

        XElement xml = XElement.Load("c:\\xmlClientes.xml", LoadOptions.SetBaseUri | LoadOptions.SetLineInfo);

 

        XElement Newxml = new XElement(

                          new XElement("Cliente",

                              new XAttribute("CliID", "2"),

                              new XElement("Nome", "Juca das Neves"),

                              new XElement("Email", "juca@bol.com.br")

                          )

                      );

 

        xml.Add(Newxml);

 

        xml.Save("c:\\xmlClientes.xml");

 

    }

 

E isso pessoal com estes exemplos realizamos quase todas operações básicas com o LINQ.XML, com isso conseguimos ter uma idéia de o quanto e simples e fácil trabalhar com este novo elemento da FrameWork 3.5.

Espero ter ajudado.

Bons Códigos...

 

 

Tags:

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

Fabiano Belmonte

Senior Architect, especialista em aplicações e-business com larga experiência em B2B (Submarino. Com e Saraiva.Com). Trabalha há 5 anos com a tecnologia .Net, aplicando conhecimentos nas diversas áreas: instituições financeiras (sistema SPB), e-commerce, gerenciamento logístico entre outras.