Triki z PowerShellem #10 – XML

2008-08-25 0:12

Obecnie magiczne trzy literki XML pojawiają się przy okazji niemal każdego aspektu programowania i informatyki w ogóle. Do przetwarzania danych zapisanych w tej postaci istnieje niezmierzona wręcz ilość różnych narzędzi. Nie jest więc niespodzianką, że nasz ulubiony PowerShell w tej dziedzinie również daleko nie odstaje :)
Jako parsera używa on oczywiście narzędzi zawartych w .NET, a dokładniej w przestrzeni nazw System.Xml. Są one jednak o wiele wygodniejsze w stosowaniu w skryptach PSh niż w zwykłych aplikacjach .NET. Spójrzmy chociażby na poniższy przykład:

  1. # rss.ps1
  2. # Czytnik kanałów RSS
  3. param ([string]$url = $(throw "No RSS specified"))
  4.  
  5. # Ściągnij zawartość kanału RSS jako XML
  6. $webClient = New-Object Net.WebClient
  7. $xml = [xml]$webClient.DownloadString($url)
  8.  
  9. # Wyświetl pozycje z wszystkich kanałów
  10. foreach ($chan in $xml.rss.channel)
  11. {
  12.     foreach ($item in $chan.item)
  13.     {
  14.         "[" + $item.pubDate + "] " + $item.title | Out-Host
  15.     }
  16. }

To nic innego, jak najprostszy czytnik kanałów RSS. Pobiera on i wyświetla nagłówki wraz z datą ich publikacji z podanego URL-a, co wygląda choćby tak:

[Fri, 22 Aug 2008 11:21:52 +0000] Używanie nagłówków Windows
[Tue, 19 Aug 2008 10:53:24 +0000] To, czego oczekuje kompilator
[Sat, 16 Aug 2008 19:28:58 +0000] Statystyczny warsztatowicz
[Thu, 14 Aug 2008 06:24:54 +0000] Makra z wielokropkiem
[Mon, 11 Aug 2008 20:12:17 +0000] Długie ciągi odwołań
[Fri, 08 Aug 2008 20:00:57 +0000] Obiektowy szowinizm
[Tue, 05 Aug 2008 15:21:31 +0000] Czy void jest typem
[Mon, 04 Aug 2008 15:12:30 +0000] Prawie jak mapa
[Sun, 03 Aug 2008 15:33:28 +0000] Triki z PowerShellem #9 – Potokowanie
[Thu, 31 Jul 2008 14:34:14 +0000] Przeciążanie przecinka

Taka jest operacja jest całkiem łatwa do przeprowadzenia. Sparsowanie łańcucha znaków do postaci XML-owego drzewka DOM, reprezentującego jego zawartość polega na przykład na “rzutowaniu” tekstu na typ xml (będący aliasem na System.Xml.XmlDocument) – i już. Następnie możemy dostać się do poszczególnych tagów używając po prostu kropki. Zatem np. $xml.rss pozwala odwołać się do głównego elementu (<rss>) w dokumencie RSS. Jeśli zaś pod daną nazwą kryje się więcej niż jeden element, możemy je iterować tak samo, jak każdą inną kolekcję (a więc np. przez foreach).

Do bardziej zaawansowanych operacji należy zapewne wykorzystać właściwości i metody klasy XmlDocument. Ale do prostych zastosowań związanych z XML-em, jakie mniej lub bardziej systematycznie przytrafiają się każdemu, powyższy sposób postępowania może być całkowicie wystarczający.

Tags: ,
Author: Xion, posted under Applications, Internet »


3 comments for post “Triki z PowerShellem #10 – XML”.
  1. Gynvael:
    August 25th, 2008 o 8:29

    Huh, a to ci dobre. Kilka linijek i jest czytnik RSS. Huh.
    Aż sobie ściągnę PSh hehe ;>

  2. MySZ:
    August 26th, 2008 o 0:23

    Od razu uprzedzam: poniższe to tylko jako ciekawostka :)
    Chciałem zobaczyć jak podobny kod będzie wyglądał w pythonie (podobny jeśli chodzi o wynik oczywiście ;) ). Wyszło że są potrzebne efektywne 4 linijki, przy ‘popsuciu’ czytelności dałoby się zredukować do dwóch, ale to by była bzdura oczywiście :) Tak więc jeśli ktoś jest zainteresowany: http://paste.python.org.pl/vYVcdr :)

  3. Xion:
    August 26th, 2008 o 10:21

    Wersję PowerShellową też można nieco skrócić, jeśli ktoś się uprze :)

    1. foreach ($chan in [xml](New-Object Net.WebClient).DownloadString($url)) {
    2.     foreach ($item in $chan.item)
    3.         { "[" + $item.pubDate + "] " + $item.title | Out-Host }
    4. }
Comments are disabled.
 


© 2017 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.