Ignore:
Timestamp:
Oct 8, 2014, 9:10:00 PM (10 years ago)
Author:
sommeria
Message:

xmltree_updated

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/@xmltree/save.m

    r805 r821  
    1 function save(tree, filename)
     1function varargout = save(tree, filename)
    22% XMLTREE/SAVE Save an XML tree in an XML file
    3 % FORMAT save(tree,filename)
     3% FORMAT varargout = save(tree,filename)
    44%
    5 % tree     - XMLTree
    6 % filename - XML output filename
     5% tree      - XMLTree
     6% filename  - XML output filename
     7% varargout - XML string
    78%_______________________________________________________________________
    89%
    910% Convert an XML tree into a well-formed XML string and write it into
    10 % a file or display it (send it to standard output) if no filename is
    11 % given.
    12 %
    13 %-----------------------------------------------------------------------
    14 % SUBFUNCTIONS:
    15 %
    16 % FORMAT print_subtree(tree,fid,order)
    17 % Send tree entity XML formatted string to fid using 'order' blanks
    18 % tree  - XML tree
    19 % fid   - file identifier
    20 % uid   - uid of the current element
    21 % order - order of recursivity
    22 %
    23 % FORMAT str = entity(str)
    24 % Tool to replace input string in internal entities
    25 % str  - string to modify
     11% a file or return it as a string if no filename is provided.
    2612%_______________________________________________________________________
    2713% @(#)save.m                 Guillaume Flandin                 01/07/11
     
    3117prolog = '<?xml version="1.0" ?>\n';
    3218
    33 %- Standard output
    34 if nargin==1
    35         fid = 1;
     19%- Return the XML tree as a string
     20if nargin == 1
     21        varargout{1} = [sprintf(prolog) ...
     22                print_subtree(tree,'',root(tree))];
    3623%- Output specified
    37 elseif nargin==2
     24else
    3825        %- Filename provided
    39         if ischar(filename)
     26        if isstr(filename)
    4027                [fid, msg] = fopen(filename,'w');
    41                 if fid==-1, error(msg);end
     28                if fid==-1, error(msg); end
    4229                if isempty(tree.filename), tree.filename = filename; end
    4330        %- File identifier provided
    4431        elseif isnumeric(filename) & prod(size(filename)) == 1
    4532                fid = filename;
    46                 prolog = ''; %- In this option, do not write any prolog
    47         %- Rubbish provided
     33                prolog = ''; %- With this option, do not write any prolog
    4834        else
    4935                error('[XMLTree] Invalid argument.');
    5036        end
     37        fprintf(fid,prolog);
     38        save_subtree(tree,fid,root(tree));
     39        if isstr(filename), fclose(fid); end
     40        if nargout == 1
     41                varargout{1} = print_subtree(tree,'',root(tree));
     42        end
    5143end
    5244
    53 fprintf(fid,prolog);
    54 print_subtree(tree,fid);
    55 
    56 if nargin==2 && ischar(filename), fclose(fid); end
    57 
    58 if nargout==1, varargout{1} = tree; end
     45%=======================================================================
     46function xmlstr = print_subtree(tree,xmlstr,uid,order)
     47        if nargin < 4, order = 0; end
     48        xmlstr = [xmlstr blanks(3*order)];
     49        switch tree.tree{uid}.type
     50                case 'element'
     51                        xmlstr = sprintf('%s<%s',xmlstr,tree.tree{uid}.name);
     52                        for i=1:length(tree.tree{uid}.attributes)
     53                                xmlstr = sprintf('%s %s="%s"', xmlstr, ...
     54                                        tree.tree{uid}.attributes{i}.key,...
     55                                        tree.tree{uid}.attributes{i}.val);
     56                        end
     57                        if isempty(tree.tree{uid}.contents)
     58                                xmlstr = sprintf('%s/>\n',xmlstr);
     59                        else
     60                                xmlstr = sprintf('%s>\n',xmlstr);
     61                                for i=1:length(tree.tree{uid}.contents)
     62                                        xmlstr = print_subtree(tree,xmlstr, ...
     63                                                tree.tree{uid}.contents(i),order+1);
     64                                end
     65                                xmlstr = [xmlstr blanks(3*order)];
     66                                xmlstr = sprintf('%s</%s>\n',xmlstr,...
     67                                        tree.tree{uid}.name);
     68                        end
     69                case 'chardata'
     70                        xmlstr = sprintf('%s%s\n',xmlstr, ...
     71                                entity(tree.tree{uid}.value));
     72                case 'cdata'
     73                        xmlstr = sprintf('%s<![CDATA[%s]]>\n',xmlstr, ...
     74                                tree.tree{uid}.value);
     75                case 'pi'
     76                        xmlstr = sprintf('%s<?%s %s?>\n',xmlstr, ...
     77                                tree.tree{uid}.target, tree.tree{uid}.value);
     78                case 'comment'
     79                        xmlstr = sprintf('%s<!-- %s -->\n',xmlstr,...
     80                                tree.tree{uid}.value);
     81                otherwise
     82                        warning(sprintf('Type %s unknown: not saved', ...
     83                                tree.tree{uid}.type));
     84        end
    5985
    6086%=======================================================================
    61 function print_subtree(tree,fid,uid,order)
    62         if nargin <3, uid = root(tree); end
     87function save_subtree(tree,fid,uid,order)
    6388        if nargin < 4, order = 0; end
    6489        fprintf(fid,blanks(3*order));
     
    6893                        for i=1:length(tree.tree{uid}.attributes)
    6994                                fprintf(fid,' %s="%s"',...
    70                                 tree.tree{uid}.attributes{i}.key,...
     95                                tree.tree{uid}.attributes{i}.key, ...
    7196                                tree.tree{uid}.attributes{i}.val);
    7297                        end
    73                         fprintf(fid,'>\n');
    74                         for i=1:length(tree.tree{uid}.contents)
    75                                 print_subtree(tree,fid,tree.tree{uid}.contents(i),order+1)
    76                         end
    77                         for i=1:order, fprintf(fid,'   '); end
    78                         fprintf(fid,'</%s>\n',tree.tree{uid}.name);
     98                        if isempty(tree.tree{uid}.contents)
     99                                fprintf(fid,'/>\n');
     100                        else
     101                                fprintf(fid,'>\n');
     102                                for i=1:length(tree.tree{uid}.contents)
     103                                        save_subtree(tree,fid,...
     104                                                tree.tree{uid}.contents(i),order+1)
     105                                end
     106                                fprintf(fid,blanks(3*order));
     107                                fprintf(fid,'</%s>\n',tree.tree{uid}.name);
     108                        end
    79109                case 'chardata'
    80110                        fprintf(fid,'%s\n',entity(tree.tree{uid}.value));
     
    82112                                fprintf(fid,'<![CDATA[%s]]>\n',tree.tree{uid}.value);
    83113                case 'pi'
    84                         fprintf(fid,'<?%s %s?>\n',tree.tree{uid}.target,tree.tree{uid}.value);
     114                        fprintf(fid,'<?%s %s?>\n',tree.tree{uid}.target, ...
     115                                tree.tree{uid}.value);
    85116                case 'comment'
    86117                        fprintf(fid,'<!-- %s -->\n',tree.tree{uid}.value);
    87118                otherwise
    88                         warning(sprintf('Type %s unknown : not saved',tree.tree{uid}.type));
     119                        warning(sprintf('[XMLTree] Type %s unknown: not saved', ...
     120                                tree.tree{uid}.type));
    89121        end
    90    
     122
     123
    91124%=======================================================================
    92125function str = entity(str)
     
    95128        str = strrep(str,'>','&gt;');
    96129        str = strrep(str,'"','&quot;');
    97         str = strrep(str,'\','&apos;');
     130        str = strrep(str,'''','&apos;');
Note: See TracChangeset for help on using the changeset viewer.