The source code

    tx.Exporter = function(){
    	var lists = tx.data.conn.query('select * from list');

    	var doc = new runtime.flash.xml.XMLDocument();

    	var root = doc.createElement('simple-tasks');
    	doc.appendChild(root);

    	root.attributes['version'] = '2.0';

    	for(var i = 0, len = lists.length; i < len; i++){
    		var list = lists[i];

    		var listNode = doc.createElement('list');
    		root.appendChild(listNode);

    		for(var k in list){
    			if(list.hasOwnProperty(k)){
    				listNode.attributes[k] = String(list[k]);
    			}
    		}

    		var tasks = tx.data.conn.queryBy('select * from task where listId = ?', [list.listId]);
    		for(var j = 0, jlen = tasks.length; j < jlen; j++){
    			var task = tasks[j];

    			var taskNode = doc.createElement('task');
    			listNode.appendChild(taskNode);

    			for(var t in task){
    				if(task.hasOwnProperty(t)){
    					taskNode.attributes[t] = String(task[t]);
    				}
    			}
    		}
    	}

    	var file = new air.File(air.File.documentsDirectory.nativePath + air.File.separator + 'tasks.xml');

    	file.addEventListener('select', function(e){
    		var target = e.target;
    		var stream = new air.FileStream();
            stream.open(target, air.FileMode.WRITE);
    		stream.writeUTFBytes('');
            stream.writeUTFBytes(doc.toString());
            stream.close();
    	});

    	// I wonder why no filter for Save As?
    	// var filter = new air.FileFilter("Tasks XML File", "*.xml");
    	file.browseForSave('Save As');
    };