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 livro

Alternativamente, 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=2

Casos 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 -Raw para ler arquivos XML, evitando problemas com quebras de linha.
  • Tratar erros de parsing com try/catch para arquivos malformados.
  • Preferir XPath para consultas complexas, pois é mais expressivo.
  • Utilizar a classe System.Xml para 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

  1. Exercício 1: Crie um script que leia o arquivo exemplo.xml (o mesmo do exemplo) e exiba o título do segundo livro.
  2. ✓ Resposta:
    $xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
    Write-Host $xml.livros.livro[1].titulo
  3. Exercício 2: Escreva um script que percorra todos os livros e exiba o id e o preço formatado com duas casas decimais.
  4. ✓ Resposta:
    $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"
    }
  5. Exercício 3: Use Select-Xml para encontrar o livro cujo autor é "Maria Souza" e exiba o título.
  6. ✓ Resposta:
    $xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
    $result = Select-Xml -Xml $xml -XPath "//livro[autor='Maria Souza']"
    $result.Node.titulo
  7. Exercício 4: Modifique o preço do segundo livro para 99.90 e salve o XML em um novo arquivo.
  8. ✓ Resposta:
    $xml = [xml](Get-Content -Path ".\exemplo.xml" -Raw)
    $livro = $xml.livros.livro[1]
    $livro.preco = "99.90"
    $xml.Save(".\exemplo_modificado.xml")
  9. 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.
  10. ✓ Resposta:
    $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
    }

Referências