Index: trunk/src/@xmltree/Contents.m
===================================================================
--- trunk/src/@xmltree/Contents.m	(revision 820)
+++ trunk/src/@xmltree/Contents.m	(revision 821)
@@ -1,4 +1,4 @@
 % XMLTree: XML Toolbox for Matlab.
-% Version 1.0  12-Apr-2002
+% Version 1.2  17-Nov-2004
 %
 % XML file I/O.
@@ -27,4 +27,5 @@
 %
 % Graphical user interface methods (work in progress).
+%   editor      - Reimplementation of <view> for Matlab 6+
 %   view        - Graphical display of a tree.
 %   view_ui     - Useful function for view method.
@@ -38,4 +39,11 @@
 %   xml_findstr - Find one string within another (mexfile)
 %
+% Conversions Matlab <=> XML
+%   loadxml     - 
+%   savexml     - 
+%   mat2xml     - 
+%   xml2mat     - 
+%   struct2xml  - 
+%
 % Demos.
 %   xmldemo1    - Create an XML tree from scratch and save it.
@@ -43,4 +51,4 @@
 %   xmldemo3    - Read an XML file, modify some fields and save it.
 
-% Copyright 2002 Guillaume Flandin - INRIA Sophia Antipolis
-% $Revision: 1.0 $
+% Copyright 2002-2004 Guillaume Flandin <Guillaume@artefact.tk>
+% $Revision: 1.2 $
Index: trunk/src/@xmltree/attributes.m
===================================================================
--- trunk/src/@xmltree/attributes.m	(revision 820)
+++ trunk/src/@xmltree/attributes.m	(revision 821)
@@ -54,15 +54,24 @@
 		error(nargchk(3,4,nargin));
 		if nargin == 4
-			if ~isa(varargin{4},'double') | ...
+			if ischar(varargin{4})
+				for i=1:length(tree.tree{uid}.attributes)
+					if strcmp(varargin{4},tree.tree{uid}.attributes{i}.key)
+						varargout{1} = tree.tree{uid}.attributes{i}.val;
+						return;
+					end
+				end
+				varargout{1} = [];
+			elseif ~isa(varargin{4},'double') | ...
 			   any(varargin{4}>length(tree.tree{uid}.attributes)) | ...
 			   any(varargin{4}<1)
 				error('[XMLTree] Invalid attribute indice.');
-			end
-			if length(varargin{4}) == 1
-				varargout{1} = tree.tree{uid}.attributes{varargin{4}(1)};
 			else
-				varargout{1} = {};
-				for i=1:length(varargin{4})
-					varargout{1}{i} = tree.tree{uid}.attributes{varargin{4}(i)};
+				if length(varargin{4}) == 1
+					varargout{1} = tree.tree{uid}.attributes{varargin{4}(1)};
+				else
+					varargout{1} = {};
+					for i=1:length(varargin{4})
+						varargout{1}{i} = tree.tree{uid}.attributes{varargin{4}(i)};
+					end
 				end
 			end
Index: trunk/src/@xmltree/branch.m
===================================================================
--- trunk/src/@xmltree/branch.m	(revision 820)
+++ trunk/src/@xmltree/branch.m	(revision 821)
@@ -22,4 +22,6 @@
 subtree = xmltree;
 subtree = set(subtree,root(subtree),'name',tree.tree{uid}.name);
+%- fix by Piotr Dollar to copy attributes for the root node:
+subtree = set(subtree,root(subtree),'attributes',tree.tree{uid}.attributes); 
 
 child = children(tree,uid);
Index: trunk/src/@xmltree/convert.m
===================================================================
--- trunk/src/@xmltree/convert.m	(revision 820)
+++ trunk/src/@xmltree/convert.m	(revision 821)
@@ -75,6 +75,22 @@
 				s = sub_setfield(s,arg{:},'');
 			end
+            %- saving attributes : does not work with <a t='q'>b</a>
+            %- but ok with <a t='q'><c>b</c></a>
+%             attrb = attributes(tree,'get',uid);     %-
+%             if ~isempty(attrb)                      %-
+%                 arg2 = {arg{:} 'attributes'};       %-
+%                 s = sub_setfield(s,arg2{:},attrb);  %-
+% 			  end                                     %-
 		case 'chardata'
 			s = sub_setfield(s,arg{:},get(tree,uid,'value'));
+			%- convert strings into their Matlab equivalent when possible
+			%- e.g. string '3.14159' becomes double scalar 3.14159
+%             v = get(tree,uid,'value');              %-
+% 		 	  cv = str2num(v);                        %-
+% 			  if isempty(cv)                          %-
+% 				  s = sub_setfield(s,arg{:},v);       %-
+% 			  else                                    %-
+% 				  s = sub_setfield(s,arg{:},cv);      %-
+%             end                                     %-
 		case 'cdata'
 			s = sub_setfield(s,arg{:},get(tree,uid,'value'));
@@ -95,5 +111,5 @@
 						s = sub_setfield(s,arg{:},feval(app,get(tree,uid,'value')));
 					catch,
-						warning('[Xmltree/convert] Unknown target application');
+						warning('[XMLTREE] Unknown target application');
 					end
 			end
@@ -115,5 +131,5 @@
     if (isa(varargin{i}, 'cell'))
         types{i} = '{}';
-    elseif ischar(varargin{i})
+    elseif isstr(varargin{i})
         types{i} = '.';
         subs{i} = varargin{i}; %strrep(varargin{i},' ',''); % deblank field name
Index: trunk/src/@xmltree/save.m
===================================================================
--- trunk/src/@xmltree/save.m	(revision 820)
+++ trunk/src/@xmltree/save.m	(revision 821)
@@ -1,27 +1,13 @@
-function save(tree, filename)
+function varargout = save(tree, filename)
 % XMLTREE/SAVE Save an XML tree in an XML file
-% FORMAT save(tree,filename)
+% FORMAT varargout = save(tree,filename)
 %
-% tree     - XMLTree
-% filename - XML output filename
+% tree      - XMLTree
+% filename  - XML output filename
+% varargout - XML string
 %_______________________________________________________________________
 %
 % Convert an XML tree into a well-formed XML string and write it into
-% a file or display it (send it to standard output) if no filename is 
-% given.
-%
-%-----------------------------------------------------------------------
-% SUBFUNCTIONS:
-%
-% FORMAT print_subtree(tree,fid,order)
-% Send tree entity XML formatted string to fid using 'order' blanks
-% tree  - XML tree
-% fid   - file identifier
-% uid   - uid of the current element
-% order - order of recursivity
-%
-% FORMAT str = entity(str)
-% Tool to replace input string in internal entities
-% str  - string to modify
+% a file or return it as a string if no filename is provided.
 %_______________________________________________________________________
 % @(#)save.m                 Guillaume Flandin                 01/07/11
@@ -31,34 +17,73 @@
 prolog = '<?xml version="1.0" ?>\n';
 
-%- Standard output
-if nargin==1
-	fid = 1;
+%- Return the XML tree as a string
+if nargin == 1
+	varargout{1} = [sprintf(prolog) ...
+		print_subtree(tree,'',root(tree))];
 %- Output specified
-elseif nargin==2
+else
 	%- Filename provided
-	if ischar(filename)
+	if isstr(filename)
 		[fid, msg] = fopen(filename,'w');
-		if fid==-1, error(msg);end
+		if fid==-1, error(msg); end
 		if isempty(tree.filename), tree.filename = filename; end
 	%- File identifier provided
 	elseif isnumeric(filename) & prod(size(filename)) == 1
 		fid = filename;
-		prolog = ''; %- In this option, do not write any prolog
-	%- Rubbish provided
+		prolog = ''; %- With this option, do not write any prolog
 	else
 		error('[XMLTree] Invalid argument.');
 	end
+	fprintf(fid,prolog);
+	save_subtree(tree,fid,root(tree));
+	if isstr(filename), fclose(fid); end
+	if nargout == 1
+		varargout{1} = print_subtree(tree,'',root(tree));
+	end
 end
 
-fprintf(fid,prolog);
-print_subtree(tree,fid);
-
-if nargin==2 && ischar(filename), fclose(fid); end
-
-if nargout==1, varargout{1} = tree; end
+%=======================================================================
+function xmlstr = print_subtree(tree,xmlstr,uid,order)
+	if nargin < 4, order = 0; end
+	xmlstr = [xmlstr blanks(3*order)];
+	switch tree.tree{uid}.type
+		case 'element'
+			xmlstr = sprintf('%s<%s',xmlstr,tree.tree{uid}.name);
+			for i=1:length(tree.tree{uid}.attributes)
+				xmlstr = sprintf('%s %s="%s"', xmlstr, ...
+					tree.tree{uid}.attributes{i}.key,...
+					tree.tree{uid}.attributes{i}.val);
+			end
+			if isempty(tree.tree{uid}.contents)
+				xmlstr = sprintf('%s/>\n',xmlstr);
+			else
+				xmlstr = sprintf('%s>\n',xmlstr);
+				for i=1:length(tree.tree{uid}.contents)
+					xmlstr = print_subtree(tree,xmlstr, ...
+						tree.tree{uid}.contents(i),order+1);
+  				end
+				xmlstr = [xmlstr blanks(3*order)];
+				xmlstr = sprintf('%s</%s>\n',xmlstr,...
+					tree.tree{uid}.name);
+			end
+		case 'chardata'
+			xmlstr = sprintf('%s%s\n',xmlstr, ...
+				entity(tree.tree{uid}.value));
+		case 'cdata'
+			xmlstr = sprintf('%s<![CDATA[%s]]>\n',xmlstr, ...
+				tree.tree{uid}.value);
+		case 'pi'
+			xmlstr = sprintf('%s<?%s %s?>\n',xmlstr, ...
+				tree.tree{uid}.target, tree.tree{uid}.value);
+		case 'comment'
+			xmlstr = sprintf('%s<!-- %s -->\n',xmlstr,...
+				tree.tree{uid}.value);
+		otherwise
+			warning(sprintf('Type %s unknown: not saved', ...
+				tree.tree{uid}.type));
+	end
 
 %=======================================================================
-function print_subtree(tree,fid,uid,order)
-	if nargin <3, uid = root(tree); end
+function save_subtree(tree,fid,uid,order)
 	if nargin < 4, order = 0; end
 	fprintf(fid,blanks(3*order));
@@ -68,13 +93,18 @@
 			for i=1:length(tree.tree{uid}.attributes)
 				fprintf(fid,' %s="%s"',...
-				tree.tree{uid}.attributes{i}.key,...
+				tree.tree{uid}.attributes{i}.key, ...
 				tree.tree{uid}.attributes{i}.val);
 			end
-			fprintf(fid,'>\n');
-			for i=1:length(tree.tree{uid}.contents)
-				print_subtree(tree,fid,tree.tree{uid}.contents(i),order+1)
-  			end
-			for i=1:order, fprintf(fid,'   '); end
-			fprintf(fid,'</%s>\n',tree.tree{uid}.name);
+			if isempty(tree.tree{uid}.contents)
+				fprintf(fid,'/>\n');
+			else
+				fprintf(fid,'>\n');
+				for i=1:length(tree.tree{uid}.contents)
+					save_subtree(tree,fid,...
+						tree.tree{uid}.contents(i),order+1)
+  				end
+				fprintf(fid,blanks(3*order));
+				fprintf(fid,'</%s>\n',tree.tree{uid}.name);
+			end
 		case 'chardata'
 			fprintf(fid,'%s\n',entity(tree.tree{uid}.value));
@@ -82,11 +112,14 @@
 				fprintf(fid,'<![CDATA[%s]]>\n',tree.tree{uid}.value);
 		case 'pi'
-			fprintf(fid,'<?%s %s?>\n',tree.tree{uid}.target,tree.tree{uid}.value);
+			fprintf(fid,'<?%s %s?>\n',tree.tree{uid}.target, ...
+				tree.tree{uid}.value);
 		case 'comment'
 			fprintf(fid,'<!-- %s -->\n',tree.tree{uid}.value);
 		otherwise
-			warning(sprintf('Type %s unknown : not saved',tree.tree{uid}.type));
+			warning(sprintf('[XMLTree] Type %s unknown: not saved', ...
+				tree.tree{uid}.type));
 	end
-   
+
+
 %=======================================================================
 function str = entity(str)
@@ -95,3 +128,3 @@
 	str = strrep(str,'>','&gt;');
 	str = strrep(str,'"','&quot;');
-	str = strrep(str,'\','&apos;');
+	str = strrep(str,'''','&apos;');
Index: trunk/src/@xmltree/xmltree.m
===================================================================
--- trunk/src/@xmltree/xmltree.m	(revision 820)
+++ trunk/src/@xmltree/xmltree.m	(revision 821)
@@ -3,9 +3,10 @@
 % FORMAT tree = xmltree(varargin)
 % 
-% filename - XML filename
+% varargin - XML filename or XML string
 % tree     - XMLTree Object
 %
-%     tree = xmltree;            % creates a minimal XML tree: <tag/>
-%     tree = xmltree(filename);  % creates a tree from an XML file
+%     tree = xmltree;             % creates a minimal XML tree: '<tag/>'
+%     tree = xmltree('foo.xml');  % creates a tree from XML file 'foo.xml'
+%     tree = xmltree('<tag>content</tag>') % creates a tree from string
 %_______________________________________________________________________
 %
@@ -32,6 +33,20 @@
 			tree = varargin{1};
 		elseif ischar(varargin{1})
-			tree.tree = xml_parser(varargin{1});
-			tree.filename = varargin{1};
+			% Input argument is an XML string
+			if (exist(varargin{1}) ~= 2 & ...
+				~isempty(xml_findstr(varargin{1},'<',1,1)))
+				tree.tree = xml_parser(varargin{1});
+				tree.filename = '';
+			% Input argument is an XML filename
+			else
+				fid = fopen(varargin{1},'rt');
+				if (fid == -1) 
+					error(['[XMLTree] Cannot open ' varargin{1}]);
+				end
+				xmlstr = fscanf(fid,'%c');
+				fclose(fid);
+				tree.tree = xml_parser(xmlstr);
+				tree.filename = varargin{1};
+			end
 			tree = class(tree,'xmltree');
 		else 
@@ -39,4 +54,4 @@
 		end
 	otherwise
-		error('[XMLTree] Bad number of arguments');
+		error('[XMLTree] Too many input arguments');
 end
