Este é o último artigo, por agora, sobre XML Literals. Os artigos anteriores mostraram diversas coisas importantes, como por exemplo, criar um ficheiro XML, ler e pesquisar informação (usando LINQ e Lambda Expressions), mas até agora ainda não foram referidos alguns pontos essenciais para a manipulação deste tipo de ficheiros: modificação, inserção e eliminação.
Neste artigo será mostrado como fazer estas operações com base no seguinte ficheiro XML, que terá o nome “myFile.xml”
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!--Lista de livros e revistas>
<library>
<books>
<book name="Crepúsculo"author="Stephenie Meyer" />
<book name="Equador"author="Miguel S. Tavares" />
<book name="O Sétimo Selo"author="José R. dos Santos" />
</books>
<magazine>
<magazineName>MSDN Magazine</magazineName>
<magazineName>Code Magazine</magazineName>
</magazine>
</library>
Modificar
Para modificar um ficheiro XML, depois de o ler, é apenas necessário escolher o elemento a modificar e atribuir um novo valor. De acordo com o ficheiro base, e para alterar no grupo “Magazine” de “MSDN Magazine” para outro valor, podíamos fazer:
Dim xmlFile = XDocument.Load(strFileName)
xmlFile...<magazineName>.Value = "Novo Valor"
Isto irá modificar o primeiro elemento que encontrar, uma vez que utilizamos a propriedade descendantes, que neste caso é a que pretendemos. Para modificar um elemento especifico, podemos uma vez mais recorrer a Lambda ou LINQ, e seleccionar apenas esse, como por exemplo, modificar um atributo no grupo “books”
Dim xmlFile = XDocument.Load(strFileName)
Dim element = xmlFile.<library>.<books>.<book>.Where(Function(f) _
f.@name = "Equador")
element.@author = "Jorge Paulino"
Este exemplo indica o caminho completo, mas podemos, uma vez mais, usar a propriedade descendantes, simplificando o código (apenas em duas linhas):
Dim xmlFile = XDocument.Load(strFileName)
xmlFile...<book>.Where(Function(f) _
f.@name = "Equador").@author = "Jorge Paulino"
Inserir
Para inserirmos um novo elemento no ficheiro XML, é necessário “construir” o novo XElement, e depois adiciona-lo à posição correcta. Podemos fazer isto pelo menos de duas formas: criando um XElement e os respectivos(caso existam) XAtributes:
Dim xmlFile = XDocument.Load(strFileName)
Dim element = New XElement("book", _
New XAttribute("name", "XML Literals"), _
New XAttribute("author", "Jorge Paulino"))
Dim parent = xmlFile...<books>.FirstOrDefault()
parent.Add(element)
Ou directamente no código:
Dim xmlFile = XDocument.Load(strFileName)
Dim element = <book name="XML Literals" author="Jorge Paulino"/>
Dim parent = xmlFile...<books>.FirstOrDefault()
parent.Add(element)
Neste segundo exemplo, e caso queiramos substituir o valor dos atributos por uma variável, podemos usar Embedded Expressions, utilizando as tags <%= %>, como já explicado num artigo anterior.
Eliminar
Eliminar um elemento é bastante simples e semelhante à modificação.
Dim xmlFile = XDocument.Load(strFileName)
xmlFile...<magazineName>.Remove()
Este exemplo mostra como remover os elementos com a tag “magazineName”. Mas atenção, este exemplo elimina todos os elementos com a tag indicada. Para apagarmos apenas um elemento especifico, temos de indicar qual.
Dim xmlFile = XDocument.Load(strFileName)
xmlFile...<book>.Where(Function(f) f.@author = "Stephenie Meyer").Remove()
Em todos os exemplos mostrados, é necessário gravar as alterações efectuadas, usando simplemente:
xmlFile.Save(strFileName)
E para já é tudo!
Espero que estes exemplos de XML Literals, em conjunto com Lambda e LINQ, tenham ajudado a uma mais fácil utilização de ficheiros XML.
O FUTURO DA WEB NASCE AQUI |  |
Dia 2 de Outubro, terá lugar o ReMIX no auditório da Reitoria da Universidade Nova de Lisboa: um dia completo com três tracks, 13 sessões e os melhores Oradores que fizeram palco no MIX 2009: Adam Kinney, Arturo Toledo, August de los Reyes, Brad Abrams, Simon Guest, a par com os nomes bem conhecidos (e reconhecidos) de José António Silva, Luis Alves Martins e Nuno Silva.
O ReMIX traz-lhe as tendência e a inovação Web: o futuro das tecnologias como o Silverlight, o Internet Explorer, Expression, ASP.NET e Windows Azure.
Para mais informações, agenda, oradores e registo:
http://www.microsoft.com/portugal/remix/index.aspx
Número de lugares limitado. 50€, com IVA incluído
Um dos benefícios do uso de XML Literals é a facilidade de ler informação e com isso melhorar o código e reduzir o tempo de desenvolvimento. Existem algumas formas de ler informação, como por exemplo LINQ ou Lambda Expressions, e como num artigo anterior já foi referido alguma coisa sobre LINQ, neste artigo será apenas utilizado Lambda.
Estes métodos de pesquisa serão a base para modificar dados, apagar ou inserir novos elementos, mas isto, será mostrado brevemente.
Ficheiro: “myFile.xml”
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<!--Lista de livros e revistas –>
<library>
<books>
<book name="Crepúsculo"author="Stephenie Meyer" />
<book name="Equador"author="Miguel S. Tavares" />
<book name="O Sétimo Selo"author="José R. dos Santos" />
</books>
<magazine>
<magazineName>MSDN Magazine</magazineName>
<magazineName>Code Magazine</magazineName>
</magazine>
</library>
A leitura de um ficheiro, começa sempre pela sua leitura para uma variável, e para isso utilizamos um XDocument. Depois, mediante o tipo de informação que queremos pesquisar/ler, utilizam-se diferentes métodos.
Nota: O nome do ficheiro está guardado na variável strFileName
Dim strFileName As String = "d:\myFile.xml"
Uma leitura simples de um elemento, por exemplo “magazineName”, será feito da seguinte forma:
Dim xmlFile = XDocument.Load(strFileName)
Debug.WriteLine(xmlFile...<magazineName>.Value)
Tão simples com isto! Este método utiliza a propriedade descendants, que irá procurar todos os elementos que tenham a tag indicada.
O resultado, na Immediate Window será “MSDN Magazine”, ou seja, o primeiro elemento que encontrar. Mas podemos também procurar por um valor nos elementos com a mesma tag, neste caso 2, utilizando, por exemplo, Lambda.
Dim xmlFile = XDocument.Load(strFileName)
Debug.WriteLine(xmlFile...<magazineName>.Where(Function(f) _
f.Value = "Code Magazine").Value)
Para mostrar um atributo da categoria <Books> o método é semelhante. Desta vez, como se trata de um atributo, é usado a “@”, seguido do nome do atributo.
Dim xmlFile = XDocument.Load(strFileName)
Debug.WriteLine(xmlFile...<book>.@author)
Mas isto irá mostrar apenas o primeiro autor, do primeiro elemento. E se quisermos o nome do autor do livro “Equador” ? Podemos utilizar uma vez mais Lambda.
Dim xmlFile = XDocument.Load(strFileName)
Debug.WriteLine(xmlFile...<book>.Where(Function(f) _
f.@name = "Equador").@author)
Desta forma, pesquisamos o elemento cujo atributo name é igual a “Equador”, e mostramos o nome do author.
Estes são mais alguns exemplos que mostram como é simples ler informação de um ficheiro XML, usando XML Literals.
As Embedded Expressions não são mais do que expressões que podemos utilizar embebidas nos código, colocando a expressão entre as tags <%= expressão %>, que é o mesmo sintaxe que é utilizado em ASP.NET.
Desta forma, é muito simples com base numa lista, DataTable, DataSet, etc., criar um ficheiro XML com a estrutura pretendida.
Um exemplo simples, utilizando um Func Delegate (Lambda Expressions) que soma dois valores:
' Define a Lambda Expression
Dim f As Func(Of Integer, Integer, Integer) = Function(x, y) x + y
Dim exemplo = _
<teste>
<valor><%= f(125, 125).ToString() %></valor>
</teste>
O resultado será:
<teste>
<valor>250</valor>
</teste>
Mas podemos incluir o cabeçalho de um ficheiro XML, e usando o LINQ, preencher o ficheiro de uma forma bastante simples com base numa lista, neste exemplo, List(Of T)
' Cria uma lista com alguns livros
Dim bookList As New List(Of String)
bookList.AddRange(New String() {"Crepúsculo", "Equador", "O Sétimo Selo"})
' Gera o XML e grava para o disco.
Dim newBookList1 = _
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<library>
<books>
<%= From b In bookList Select <book><%= b %></book> %>
</books>
</library>
newBookList1.Save("c:\result.xml")
Neste exemplo, o resultado será:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<library>
<books>
<book>Crepúsculo</book>
<book>Equador</book>
<book>O Sétimo Selo</book>
</books>
</library>
Usando o método DataTable.WriteXml() ou Datset.WriteXml() é muito simples gravar o conteúdo de uma base de dados ou de uma tabela para um ficheiro XML. No entanto, não permite criar com o formato especifico ou usar apenas alguns campos.
Desta forma, e usando Embedded Expressions, podemos formatar o resultado final, como se pode ver no seguinte exemplo:
' Neste exemplo tudo é criado manualmente, mas os dados poderiam
' ser preenchidos de uma tabela SQL ou outra base de dados qualquer
Dim dt As New DataTable("Livros")
dt.Columns.Add("Livro", GetType(String))
dt.Columns.Add("Autor", GetType(String))
dt.Rows.Add("Crepúsculo", "Stephenie Meyer")
dt.Rows.Add("Equador", "Miguel S. Tavares")
dt.Rows.Add("O Sétimo Selo", "José R. dos Santos")
Dim ds As New DataSet
ds.Tables.Add(dt)
' Gera o XML, definindo 2 atributos: "name" e "author"
Dim newBookList2 = _
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Isto é apenas um comentário –>
<library>
<books>
<%= From b In ds.Tables("Livros") Select _
<book name=<%= b.Item("Livro") %>
author=<%= b.Item("Autor") %>/> %>
</books>
</library>
' Grava para o disco
newBookList2.Save("c:\result.xml")
Finalmente o resultado:
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<library>
<books>
<book name="Crepúsculo"author="Stephenie Meyer" />
<book name="Equador"author="Miguel S. Tavares" />
<book name="O Sétimo Selo"author="José R. dos Santos" />
</books>
</library>
Como podem ver, usando Embedded Expressions e XML Literals, consegue-se fácilmente criar ficheiros XML e com a estrutura do ficheiro definida no código.
Espero que ajude!