Processing 2.0 の XML まわりの変更について
Processing-2.0a8を触っていたらXMLまわりで少し躓いたのでメモ。
古いリファレンスを見ながらXMLElementを使おうとしたら怒られたことに端を発する。
XMLElement xml;
//=> Cannot find a class or type named "XMLElement"
本家に確認しに行ってみると、XMLElementはXMLに取って代わったよ、とのこと。
A new class called XML replaces the old XMLElement. With the change, you can call loadXML("blah.xml") from inside PApplet to read XML data. ...
ふむふむなるほど、ということでとりあえずリファレンスのExamplesの通りにsites.xmlという名前で以下のXMLファイルを用意して、
<?xml version="1.0"?> <websites> <site id="0" url="processing.org">Processing</site> <site id="1" url="mobile.processing.org">Processing Mobile</site> </websites>
Examplesを一部修正したコードを動かすも、NullPointerExceptionが出てダメ。
???となりながら、getChildCount()の結果を確認してみると、5だった。
XML xml = loadXML("sites.xml"); //=> この行はそのままでは動作しないので修正済み int numSites = xml.getChildCount(); println("numSites: " + numSites); //=> "numSites: 5"
改行や空白が含まれているとgetChildCount()の結果がおかしくなるらしい。
sites.xmlを以下のように修正すると、Examplesが正しく動いた。
<?xml version="1.0"?> <websites><site id="0" url="processing.org">Processing</site><site id="1" url="mobile.processing.org">Processing Mobile</site></websites>
XML xml = loadXML("sites.xml"); int numSites = xml.getChildCount(); println("numSites: " + numSites); //=> "numSites: 2"
1.x系で XMLElement を使うと改行含んでようが空白含んでようがうまく動くので、バグかなあと思ってチケットを漁ってみた。
http://code.google.com/p/processing/issues/detail?id=908
結論としてはどうもこれで正しい挙動らしい。ドキュメントはまだ書けていない、2.0正式リリースまでには修正するよ、とのこと。
約1年前の話題であった。トホホ。ちゃんと変更は追いかけなきゃダメだということだ。
XML書くときは全部1行にまとめなきゃならんのか?と不安になるが、上記のチケットに改行や空白を含んでいてもうまく動かせるような手法を書いてくれている人がいる。
でもわざわざそんなことをしなきゃならないのはどうなんだろう。