OpenOffice.orgのAPIには、XMLを読み込んでDOM文書を作成するDocumentBuilderやDOMの各要素に対応するサービス/インターフェースが用意されています。BasicマクロからこれらのAPIを呼び出せば、任意のURL(ローカルファイルやネット)にあるXML文書を読み込んで、そのデータを処理することができるわけです。
マクロでXMLを扱えるようになれば、XMLでデータを保存するソフトと連携してCalcの表計算シートでデータを集計したり、Baseのデータベースに登録したり、とデータ活用の幅が広がるかもしれません。
XML文書を読み込むには、まずcom.sun.star.xml.dom.DocumentBuildeサービスを作成します。続いて、XDocumentBuildeインターフェースのparseURIメソッドでURIを指定するとURIからXMLが読み込まれ、DOMが作成されます。後は、JavaScriptなど他のプログラミング言語でDOMを扱うのと同じような感覚でXMLファイルを読み込んでいくだけです。
たとえば、以下のような「ソフトの名前と公開年」を記述したXMLがあるとします。
<?xml version="1.0"?> <lib> <soft> <name>0式調画機</name> <year>2000</year> </soft> <soft> <name>ドット絵でぃた</name> <year>1997</year> </soft> <soft> <name>2式視聴機</name> <year>2002</year> </soft> </lib>
このXMLファイルを「http://www.programmingmat.jp/openoffice_macro/ooo_bmxml.xml」に置いて処理するには、以下のようなマクロを書くことになるでしょう。
Sub Main builder = CreateUnoService("com.sun.star.xml.dom.DocumentBuilder") doc = builder.parseURI("http://www.programmingmat.jp/openoffice_macro/ooo_bmxml.xml") list = doc.getElementsByTagName("soft") itemNum = list.getLength() For i = 0 To itemNum - 1 itemName = list.item(i).getElementsByTagName("name").item(0).getFirstChild().getNodeValue() itemYear = list.item(i).getElementsByTagName("year").item(0).getFirstChild().getNodeValue() MsgBox itemName & ":" & itemYear & "年" Next End Sub
マクロでXML内の要素を扱う場合は、Nodeの位置や型に注意してください。「Nodeの値」を読み込もうとして失敗する場合は、getNodeTypeでNodeTypeを確認してみましょう。
なお、文字コードについてですが、Shift-JISはエラーになるようです。独自のXMLを作成しマクロで処理する場合は、UTF-8Nなどで試してみてください。また、XMLの処理をいろいろ試しているうちに何度か「固まる」こともあったので、実験的なコードを書くような場合は、マクロをこまめに保存しておきましょう。