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の処理をいろいろ試しているうちに何度か「固まる」こともあったので、実験的なコードを書くような場合は、マクロをこまめに保存しておきましょう。


創作プログラミングの街 > OpenOffice.orgマクロ開発メモ