Monday, November 08, 2010 at 12:07 AM.


	<<12/30/05; 7:45:29 AM by DW
		<<Handle structured lists.
		<<Don't die if a node doesn't have an xmlUrl attribute.
		<<Should work with BlogLines's OPML list format (they have a 2-level structure).
	<<12/28/05; 8:35:41 PM by DW
		<<Return true if we did a scan, false otherwise. This allows the caller to put up a dialog saying that the scan is complete, and offer to display the new items.
	<<2/2/02; 4:23:16 PM by JES
		<<Pass a 0 to file.getFileDialog, for the type parameter instead of nil. Fixes a bug where files could not be opened on MacOS X.
	<<11/25/01; 9:13:34 AM by DW

local (f);
if file.getfiledialog ("Choose a subscriptions file:", @f, 0) {
	local (adrdata = xml.aggregator.init ());
	local (xmltext = file.readwholefile (f), xstruct);
	xml.compile (xmltext, @xstruct);
	local (adropml = xml.getAddress (@xstruct, "opml"));
	local (adrbody = xml.getAddress (adropml, "body"));
	local (ctimports = 0);
	on dolevel (adroutline) {
		local (adr);
		for adr in adroutline {
			if string.lower (nameof (adr^)) contains "outline" {
				local (adratts = @adr^.["/atts"]);
				if defined (adratts^) {
					if defined (adratts^.xmlUrl) {
						local (adrservice = @adrdata^.services.[adratts^.xmlUrl]);
						msg (adratts^.xmlUrl);
						if not defined (adrservice^) {
							new (tabletype, adrservice);
				dolevel (adr)}}}; //recurse
	dolevel (adrbody);
	if ctimports > 0 {
		if dialog.yesno (ctimports + " services were imported, would you like to do a scan now?") {
			window.about ();
			xml.aggregator.readAllServices ();
			return (true)}}
	else {
		dialog.alert ("All the services in the subscription file were already in your subscription list.")}};
return (false)

This listing is for code that runs in the OPML Editor environment. I created these listings because I wanted the search engines to index it, so that when I want to look up something in my codebase I don't have to use the much slower search functionality in my object database. Dave Winer.