If you're looking for a text-based alternative to XML, I'd recommend CSV. The
Text::CSV module handles proper quoting so you don't have to worry about weird characters in your data messing up your flat file's structure. This also gives you one-record-per-line, which would allow "stream-based parsing" like you were looking for.
However, take
sri up on the suggestion to use
DBD::SQLite and see if that works out first. Looks like a great fit for your application to me.