%'struct2xml': transform a matlab structure to a xml tree.
%--------------------------------------------------------------
% each field with char string or num vector is transformed into a corresponding  xml element
% each field with a matrix containing n lines is transformed into a xml element repeated n times 
% WARNING: PROBLEM WITH HIERARCHICAL structures
%%%%%%%%%%%%%%%%%%%%%%%
% OUTPUT:
% t: xmltree reproducing the structure of Object
% type 'save(t)' to visualize the xml text and save(filename,t) to save it in a file
%
% INPUT:
%  Object: matlab structure, possibly hierarchical
%  t: optional input xml tree in which a new branch needs to be appended
%  root_uid: optional uid of the xml element under which the new subtree must be appended

function t=struct2xml(Object,t,root_uid)
get(t,root_uid)
if ~exist('t','var')
    t=xmltree;
end
if ~exist('root_uid','var')
    root_uid=1;
end
fieldnames=fields(Object);
for ilist=1:length(fieldnames)
   eval(['val=Object.' fieldnames{ilist} ';'])
   if isstruct(val)
      [t,uid]=add(t,root_uid,'element',fieldnames{ilist});
      fieldnames_sub=fields(val);
      for ilist_sub=1:length(fieldnames_sub)
          if isstruct(fieldnames_sub{ilist_sub})
                t=struct2xml(fieldnames_sub{ilist_sub},t,uid);
                save(t)
          else
              eval(['val_sub=val.' fieldnames_sub{ilist_sub} ';'])
              t=add_element(t,uid,fieldnames_sub{ilist_sub},val_sub);
          end
      end
   else
       t=add_element(t,root_uid,fieldnames{ilist},val);
   end
end

    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function t=add_element(t,uid,key,val)
 if ischar(val)
     [t,new_uid]=add(t,uid,'element',key);
     [t]=add(t,new_uid,'chardata',val);
 elseif isnumeric(val)
       siz=size(val);
       if length(siz)<=2 %do not translate matrices with more than 2 indices
           for iline=1:siz(1)
                val_str=num2str(val(iline,:),'%g\t');
                [t,new_uid]=add(t,uid,'element',key);
                if siz(1)>1
                    t = attributes(t,'add',new_uid,'i',num2str(iline));
                end
                [t]=add(t,new_uid,'chardata',val_str);
           end
       end
 end   