【Nim】XMLをDOMで読み込む
この記事は「Nim Advent Calendar 2021」の20日目の記事として登録させてもらっています。
NimのXMLパーサーについて
NimのXMLパーサーはSAX形式/DOM形式両方あります。
- std/parsexml : SAX形式のパーサーです。
- std/xmlparser : DOM形式*1のパーサーです。
- std/xmltree : XMLのモデルデータです。xmlparserでパースするとこのxmltreeのデータが得られます。
parsexml
がSAX形式で、xmlparser
がDOM形式です。xmltree
はDOM表現です。
今回は、std/xmlparser
とstd/xmltree
を使ったDOM形式でのパース方法を簡単に紹介します。
(おまけ)SAXにするかDOMにするか
XMLをパースするときSAXとDOMの2つの選択肢がありますが、よほど巨大なXMLを読み込む場合、もしくはよほどパフォーマンスに気をつける必要がある場合を除いてDOMを使うことをおすすめします。 なぜなら圧倒的にDOMの方が楽だからです。私は一度SAXでやろうとして挫折してDOMにしたことがあります。今どきDOMでパフォーマンス上問題になることはそうそう無いでしょう。
XMLファイルを読み込む
import std/xmlparser import std/xmltree var node: XmlNode = xmlparser.loadXml( "XMLファイルパス" )
DOM(XmlNode)にアクセスする
自身(要素)の情報にアクセスする
- タグ名を取得する :
node.tag
ドキュメント - テキスト部分を取得する(内部の入れ子要素のテキストも) :
node.innerText
ドキュメント - 属性の値(string)を取得する :
node.attr( "hoge" )
ドキュメント - すべての属性を取得する :
node.attrs()
ドキュメント
子要素を取得する
- インデックスで取得する :
node[0]
ドキュメント - タグ名で取得する(最初に見つかったもの) :
node.child( "hoge" )
ドキュメント - タグ名で取得する(全部) :
node.findAll( "hoge" )
ドキュメント - すべての子要素を取得する(for文) :
for i in node:
ドキュメント
例
var node: XmlNode = xmlparser.loadXml( "XMLファイルパス" ) for childNode in node: case childNode.tag of "hoge": # 子のhogeタグを見つけた場合の処理 of "foo": # 子のfooタグを見つけた場合の処理
まとめ
使い方が簡単すぎて内容が短くなってしまいましたが、とりあえずこれだけで十分XMLを解析できると思います。
*1:More efficient and simpler than the DOMとなっているので、正確にはDOMではないようです