Ignore:
Timestamp:
Feb 17, 2016, 12:52:48 PM (8 years ago)
Author:
sommeria
Message:

xmltree updated

File:
1 edited

Legend:

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

    r821 r925  
    66% filename  - XML output filename
    77% varargout - XML string
    8 %_______________________________________________________________________
     8%__________________________________________________________________________
    99%
    1010% Convert an XML tree into a well-formed XML string and write it into
    1111% a file or return it as a string if no filename is provided.
    12 %_______________________________________________________________________
    13 % @(#)save.m                 Guillaume Flandin                 01/07/11
     12%__________________________________________________________________________
     13% Copyright (C) 2002-2011  http://www.artefact.tk/
    1414
    15 error(nargchk(1,2,nargin));
     15% Guillaume Flandin
     16% $Id: save.m 4460 2011-09-05 14:52:16Z guillaume $
     17
     18
     19%error(nargchk(1,2,nargin));
    1620
    1721prolog = '<?xml version="1.0" ?>\n';
     
    1923%- Return the XML tree as a string
    2024if nargin == 1
    21         varargout{1} = [sprintf(prolog) ...
    22                 print_subtree(tree,'',root(tree))];
     25    varargout{1} = [sprintf(prolog) ...
     26        print_subtree(tree,'',root(tree))];
    2327%- Output specified
    2428else
    25         %- Filename provided
    26         if isstr(filename)
    27                 [fid, msg] = fopen(filename,'w');
    28                 if fid==-1, error(msg); end
    29                 if isempty(tree.filename), tree.filename = filename; end
    30         %- File identifier provided
    31         elseif isnumeric(filename) & prod(size(filename)) == 1
    32                 fid = filename;
    33                 prolog = ''; %- With this option, do not write any prolog
    34         else
    35                 error('[XMLTree] Invalid argument.');
    36         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
     29    %- Filename provided
     30    if ischar(filename)
     31        [fid, msg] = fopen(filename,'w');
     32        if fid==-1, error(msg); end
     33        if isempty(tree.filename), tree.filename = filename; end
     34    %- File identifier provided
     35    elseif isnumeric(filename) && numel(filename) == 1
     36        fid = filename;
     37        prolog = ''; %- With this option, do not write any prolog
     38    else
     39        error('[XMLTree] Invalid argument.');
     40    end
     41    fprintf(fid,prolog);
     42    save_subtree(tree,fid,root(tree));
     43    if ischar(filename), fclose(fid); end
     44    if nargout == 1
     45        varargout{1} = print_subtree(tree,'',root(tree));
     46    end
    4347end
    4448
    45 %=======================================================================
     49%==========================================================================
    4650function 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
     51    if nargin < 4, order = 0; end
     52    xmlstr = [xmlstr blanks(3*order)];
     53    switch tree.tree{uid}.type
     54        case 'element'
     55            xmlstr = sprintf('%s<%s',xmlstr,tree.tree{uid}.name);
     56            for i=1:length(tree.tree{uid}.attributes)
     57                xmlstr = sprintf('%s %s="%s"', xmlstr, ...
     58                    tree.tree{uid}.attributes{i}.key,...
     59                    tree.tree{uid}.attributes{i}.val);
     60            end
     61            if isempty(tree.tree{uid}.contents)
     62                xmlstr = sprintf('%s/>\n',xmlstr);
     63            else
     64                xmlstr = sprintf('%s>\n',xmlstr);
     65                for i=1:length(tree.tree{uid}.contents)
     66                    xmlstr = print_subtree(tree,xmlstr, ...
     67                        tree.tree{uid}.contents(i),order+1);
     68                end
     69                xmlstr = [xmlstr blanks(3*order)];
     70                xmlstr = sprintf('%s</%s>\n',xmlstr,...
     71                    tree.tree{uid}.name);
     72            end
     73        case 'chardata'
     74            xmlstr = sprintf('%s%s\n',xmlstr, ...
     75                entity(tree.tree{uid}.value));
     76        case 'cdata'
     77            xmlstr = sprintf('%s<![CDATA[%s]]>\n',xmlstr, ...
     78                tree.tree{uid}.value);
     79        case 'pi'
     80            xmlstr = sprintf('%s<?%s %s?>\n',xmlstr, ...
     81                tree.tree{uid}.target, tree.tree{uid}.value);
     82        case 'comment'
     83            xmlstr = sprintf('%s<!-- %s -->\n',xmlstr,...
     84                tree.tree{uid}.value);
     85        otherwise
     86            warning(sprintf('Type %s unknown: not saved', ...
     87                tree.tree{uid}.type));
     88    end
    8589
    86 %=======================================================================
     90%==========================================================================
    8791function save_subtree(tree,fid,uid,order)
    88         if nargin < 4, order = 0; end
    89         fprintf(fid,blanks(3*order));
    90         switch tree.tree{uid}.type
    91                 case 'element'
    92                         fprintf(fid,'<%s',tree.tree{uid}.name);
    93                         for i=1:length(tree.tree{uid}.attributes)
    94                                 fprintf(fid,' %s="%s"',...
    95                                 tree.tree{uid}.attributes{i}.key, ...
    96                                 tree.tree{uid}.attributes{i}.val);
    97                         end
    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
    109                 case 'chardata'
    110                         fprintf(fid,'%s\n',entity(tree.tree{uid}.value));
    111                 case 'cdata'
    112                                 fprintf(fid,'<![CDATA[%s]]>\n',tree.tree{uid}.value);
    113                 case 'pi'
    114                         fprintf(fid,'<?%s %s?>\n',tree.tree{uid}.target, ...
    115                                 tree.tree{uid}.value);
    116                 case 'comment'
    117                         fprintf(fid,'<!-- %s -->\n',tree.tree{uid}.value);
    118                 otherwise
    119                         warning(sprintf('[XMLTree] Type %s unknown: not saved', ...
    120                                 tree.tree{uid}.type));
    121         end
     92    if nargin < 4, order = 0; end
     93    fprintf(fid,blanks(3*order));
     94    switch tree.tree{uid}.type
     95        case 'element'
     96            fprintf(fid,'<%s',tree.tree{uid}.name);
     97            for i=1:length(tree.tree{uid}.attributes)
     98                fprintf(fid,' %s="%s"',...
     99                tree.tree{uid}.attributes{i}.key, ...
     100                tree.tree{uid}.attributes{i}.val);
     101            end
     102            if isempty(tree.tree{uid}.contents)
     103                fprintf(fid,'/>\n');
     104            else
     105                fprintf(fid,'>\n');
     106                for i=1:length(tree.tree{uid}.contents)
     107                    save_subtree(tree,fid,...
     108                        tree.tree{uid}.contents(i),order+1)
     109                end
     110                fprintf(fid,blanks(3*order));
     111                fprintf(fid,'</%s>\n',tree.tree{uid}.name);
     112            end
     113        case 'chardata'
     114            fprintf(fid,'%s\n',entity(tree.tree{uid}.value));
     115        case 'cdata'
     116                fprintf(fid,'<![CDATA[%s]]>\n',tree.tree{uid}.value);
     117        case 'pi'
     118            fprintf(fid,'<?%s %s?>\n',tree.tree{uid}.target, ...
     119                tree.tree{uid}.value);
     120        case 'comment'
     121            fprintf(fid,'<!-- %s -->\n',tree.tree{uid}.value);
     122        otherwise
     123            warning(sprintf('[XMLTree] Type %s unknown: not saved', ...
     124                tree.tree{uid}.type));
     125    end
    122126
    123127
    124 %=======================================================================
     128%==========================================================================
    125129function str = entity(str)
    126         str = strrep(str,'&','&amp;');
    127         str = strrep(str,'<','&lt;');
    128         str = strrep(str,'>','&gt;');
    129         str = strrep(str,'"','&quot;');
    130         str = strrep(str,'''','&apos;');
     130    % This has the side effect of strtrim'ming the char array.
     131    str = char(strrep(cellstr(str), '&',  '&amp;' ));
     132    str = char(strrep(cellstr(str), '<',  '&lt;'  ));
     133    str = char(strrep(cellstr(str), '>',  '&gt;'  ));
     134    str = char(strrep(cellstr(str), '"',  '&quot;'));
     135    str = char(strrep(cellstr(str), '''', '&apos;'));
Note: See TracChangeset for help on using the changeset viewer.