概要
たまーに使うことがあるので、忘れないうちにメモメモ。
Goでは、JSONと同じようにXMLの場合も Struct Tags を付与できるので、解析がとても楽ですね。
試すサイトは、他サイト様にすると迷惑がかかるので、このブログにしました。
package main import ( "encoding/xml" "fmt" "io" "net/http" ) type ( Item struct { XMLName xml.Name `xml:"item"` Title string `xml:"title"` } Rss struct { XMLName xml.Name `xml:"rss"` Items []Item `xml:"channel>item"` } ) const ( URL = "https://devlights.hatenablog.com/rss" ) func panicOnErr[T any](v T, err error) T { if err != nil { panic(err) } return v } // ブログ [いろいろ備忘録日記](https://devlights.hatenablog.com/) から RSS 2.0 を取得して表示するサンプルです。 // // REFERENCES: // - https://qiita.com/you8/items/e903fd463cf770688e1e func main() { fmt.Printf("[URL] %s\n", URL) resp := panicOnErr(http.Get(URL)) body := panicOnErr(io.ReadAll(resp.Body)) defer resp.Body.Close() var rss Rss if err := xml.Unmarshal(body, &rss); err != nil { panic(err) } for i, item := range rss.Items { fmt.Printf("[%2d] %s\n", i+1, item.Title) } }
go-taskのタスクファイルは以下。
version: '3' tasks: default: cmds: - task: run install-lib: cmds: - go install golang.org/x/tools/cmd/goimports@latest - go install honnef.co/go/tools/cmd/staticcheck@latest build: deps: [ install-lib ] cmds: - goimports -w . - go vet - staticcheck - go build run: deps: [ build ] cmds: - ./rss2
実行すると以下のようになります。
gitpod /workspace/try-golang (master) $ task -d examples/singleapp/rss2/ task: [install-lib] go install golang.org/x/tools/cmd/goimports@latest task: [install-lib] go install honnef.co/go/tools/cmd/staticcheck@latest task: [build] goimports -w . task: [build] go vet task: [build] staticcheck task: [build] go build task: [run] ./rss2 [URL] https://devlights.hatenablog.com/rss [ 1] SQLcl (Oracle SQL Developer Command Line, SQL*Plusのモダンな版) [ 2] Github codespaces が Prebuild に対応 (Prebuilding codespaces is generally available) [ 3] grepコマンド チートシート (Grep cheatsheet) [ 4] Dragonfly (Redis互換でio_uringを使うインメモリデータストア) [ 5] Windowsで手軽にgifを作れるツール (ScreenToGif) [ 6] Java の 1.0 から 18 までの歴史 (Java history from Java 1.0 to Java 18) [ 7] Goメモ-213 (runtime.Goschedについて)(yield, 実行権の放棄) [ 8] vimで very magic検索 (\v) を使って検索 [ 9] vimで検索時にキャプチャせずにカッコを使う [10] Goメモ-212 (log.Fatalとlog.Panicの違い) [11] Goメモ-211 (The Go Programming Language and Environment)(Goの作者5人による寄贈記事) [12] Cypress公式のラーニングコースプログラム (Real World Testing with Cypress) [13] Goメモ-210 (golang.org/x/exp/maps)(Go 1.18 リリース時には含まれなかった汎用マップ処理) [14] Goメモ-209 (golang.org/x/exp/slices)(Go 1.18 リリース時には含まれなかった汎用スライス処理) [15] Goメモ-208 (golang.org/x/exp/constraints)(Go 1.18 リリース時には含まれなかった制約型) [16] Goメモ-207 (sliceの3つ目のインデックスパラメータの使い方) [17] Makefile内でプロセスを起動して後からそのプロセスをkillするやり方 [18] Microsoft Build 2022 の気になった記事 [19] Goメモ-206 (sliceにデータを追加する際のパフォーマンス比較について) [20] Goメモ-205 (ジェネリクスを使うとき・使わないときの指針) [21] Goメモ-204 (windowsでexe実行時にコマンドプロンプトが出ないようにビルド, windowsgui) [22] Goメモ-203 (Goで非同期処理する際のガイドブック的な資料, go-concurrency-guide) [23] vim で :terminal を垂直分割して表示したい場合 [24] Goメモ-202 (type alias と defined type の違い) [25] Gitpod の Chrome 拡張機能が jihulab.com へのアクセスをいきなり求めてきた [26] Goメモ-201 (無償で読めるGoの電子書籍 (softchris/golang-book)) [27] VSCode の ver.1.67 でマークダウン編集時にShift+ドロップでリンク自動生成してくれるようなった [28] Gitpod と JetBrains Gateway が連携するようになった [29] Flutterメモ-27 (Flutter 3 リリース, macOS/Linux デスクトップが stable に) [30] makeでコマンド実行中にエラーが出ても処理を継続するやり方 (--keep-going, || :)
参考情報
- RSS、atomの仕様をまとめる - Qiita
- とても参考になりました。
過去の記事については、以下のページからご参照下さい。
サンプルコードは、以下の場所で公開しています。