Trabalhando com XML
Esta aula ensina como trabalhar com XML no PowerShell, cobrindo desde a leitura e navegação até casos de uso práticos, com exemplos de código e boas práticas.
O XML (eXtensible Markup Language) é um formato de dados amplamente utilizado para armazenamento e troca de informações estruturadas. No PowerShell, o suporte a XML é nativo, permitindo que você leia, manipule e crie documentos XML com facilidade. Esta aula apresenta as principais técnicas para trabalhar com XML, desde a leitura de arquivos até a navegação por seus elementos e atributos.
Dominar o XML é essencial para automatizar tarefas de administração de sistemas, integrar serviços web (como APIs REST que retornam XML) e processar arquivos de configuração. O PowerShell oferece uma abordagem intuitiva, tratando o XML como um objeto, o que facilita a extração e modificação de dados.
Visão geral
O PowerShell trata documentos XML como objetos, permitindo que você use a sintaxe de ponto para acessar elementos e atributos. Essa abordagem é diferente da manipulação textual tradicional e proporciona um código mais limpo e legível. O cmdlet ConvertTo-Xml converte objetos .NET em XML, enquanto o Select-Xml permite consultas via XPath. Além disso, o PowerShell oferece a classe System.Xml para operações avançadas.
Para começar, é importante entender que um documento XML possui uma estrutura hierárquica de nós: elementos, atributos, texto e comentários. O PowerShell expõe esses nós como propriedades e métodos, permitindo iteração e manipulação direta.
Lendo XML
A leitura de um arquivo XML pode ser feita de duas maneiras principais: usando o cmdlet Get-Content e convertendo para XML, ou utilizando o tipo [xml] diretamente. O método mais comum é atribuir o conteúdo a uma variável tipada como [xml], que automaticamente faz o parsing e permite acesso imediato.
Por exemplo, considere um arquivo chamado exemplo.xml com a seguinte estrutura:
<?xml version="1.0" encoding="UTF-8"?>
<livros>
<livro id="1">
<titulo>Aprendendo PowerShell</titulo>
<autor>João Silva</autor>
<preco>49.90</preco>
</livro>
<livro id="2">
<titulo>PowerShell Avançado</titulo>
<autor>Maria Souza</autor>
<preco>89.90</preco>
</livro>
</livros>Para ler e acessar os dados, use:
$xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
$xml.livros.livro[0].titulo # Acessa o título do primeiro livroAlternativamente, você pode usar o cmdlet Select-Xml com XPath para consultas mais complexas. O Get-Content -Raw garante que o conteúdo seja lido como uma única string, essencial para o parsing correto.
Navegando
A navegação em XML no PowerShell é feita principalmente por meio de propriedades e índices. A hierarquia é acessada com pontos: $xml.elementoFilho. Para listas de elementos repetidos, você obtém uma coleção que pode ser indexada ou iterada com ForEach-Object.
Exemplo de iteração sobre todos os livros:
$xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
foreach ($livro in $xml.livros.livro) {
Write-Host "Título: $($livro.titulo) - Autor: $($livro.autor)"
}Para acessar atributos, use a sintaxe $elemento.atributo ou $elemento.GetAttribute('atributo'). Por exemplo, para obter o id do primeiro livro:
$primeiroLivro = $xml.livros.livro[0]
$id = $primeiroLivro.id # ou $primeiroLivro.GetAttribute('id')
Write-Host "ID do primeiro livro: $id"Se você precisar navegar com XPath, o Select-Xml é a ferramenta ideal:
$result = Select-Xml -Xml $xml -XPath "//livro[@id='2']"
$result.Node.titulo # Acessa o título do livro com id=2Casos de uso
O XML é usado em muitos cenários no dia a dia do administrador e desenvolvedor. Alguns casos comuns incluem:
- Processamento de arquivos de configuração de aplicações (como web.config, app.config).
- Integração com APIs que retornam dados em XML (ex.: serviços REST legados).
- Leitura de feeds RSS ou Atom.
- Exportação de dados de sistemas para formatos interoperáveis.
- Automação de tarefas de infraestrutura que geram relatórios em XML.
Um exemplo prático é extrair informações de um feed RSS:
$rssUrl = "https://example.com/rss"
$xml = [xml](Invoke-WebRequest -Uri $rssUrl).Content
$xml.rss.channel.item | Select-Object -First 5 | ForEach-Object {
Write-Host "Título: $($_.title)"
Write-Host "Link: $($_.link)"
}Outro caso é modificar um XML de configuração. Por exemplo, alterar o preço de um livro:
$xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
$livro = $xml.livros.livro | Where-Object { $_.id -eq "1" }
$livro.preco = "55.00"
$xml.Save(".\exemplo_modificado.xml")Boas práticas e observações finais
Ao trabalhar com XML, lembre-se de:
- Sempre usar
Get-Content -Rawpara ler arquivos XML, evitando problemas com quebras de linha. - Tratar erros de parsing com
try/catchpara arquivos malformados. - Preferir XPath para consultas complexas, pois é mais expressivo.
- Utilizar a classe
System.Xmlpara manipulação avançada, como validação com XSD. - Escape corretamente caracteres especiais ao criar XML manualmente (use
[System.Security.SecurityElement]::Escape()).
Nesta aula, você aprendeu os fundamentos de leitura, navegação e aplicações práticas do XML no PowerShell. Com essas ferramentas, você pode automatizar tarefas que envolvem esse formato de dados de forma eficiente.
Exercícios
- Exercício 1: Crie um script que leia o arquivo
exemplo.xml(o mesmo do exemplo) e exiba o título do segundo livro. - Exercício 2: Escreva um script que percorra todos os livros e exiba o id e o preço formatado com duas casas decimais.
- Exercício 3: Use
Select-Xmlpara encontrar o livro cujo autor é "Maria Souza" e exiba o título. - Exercício 4: Modifique o preço do segundo livro para 99.90 e salve o XML em um novo arquivo.
- Exercício 5: Crie um script que leia um feed RSS de exemplo (use uma URL fictícia) e exiba os títulos dos 3 primeiros itens.
$xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
Write-Host $xml.livros.livro[1].titulo$xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
foreach ($livro in $xml.livros.livro) {
$preco = [math]::Round([double]$livro.preco, 2)
Write-Host "ID: $($livro.id) - Preço: $preco"
}$xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
$result = Select-Xml -Xml $xml -XPath "//livro[autor='Maria Souza']"
$result.Node.titulo$xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
$livro = $xml.livros.livro[1]
$livro.preco = "99.90"
$xml.Save(".\exemplo_modificado.xml")$rssUrl = "https://example.com/rss"
$xml = [xml](Invoke-WebRequest -Uri $rssUrl).Content
$xml.rss.channel.item | Select-Object -First 3 | ForEach-Object {
Write-Host $_.title
}