Flat Leon Works

アプリやゲームを作ってます。

【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/xmlparserstd/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)にアクセスする

自身(要素)の情報にアクセスする

子要素を取得する

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ではないようです