Changeset 821 for trunk/src/@xmltree/save.m
- Timestamp:
- Oct 8, 2014, 9:10:00 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/@xmltree/save.m
r805 r821 1 function save(tree, filename)1 function varargout = save(tree, filename) 2 2 % XMLTREE/SAVE Save an XML tree in an XML file 3 % FORMAT save(tree,filename)3 % FORMAT varargout = save(tree,filename) 4 4 % 5 % tree - XMLTree 6 % filename - XML output filename 5 % tree - XMLTree 6 % filename - XML output filename 7 % varargout - XML string 7 8 %_______________________________________________________________________ 8 9 % 9 10 % 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. 26 12 %_______________________________________________________________________ 27 13 % @(#)save.m Guillaume Flandin 01/07/11 … … 31 17 prolog = '<?xml version="1.0" ?>\n'; 32 18 33 %- Standard output 34 if nargin==1 35 fid = 1; 19 %- Return the XML tree as a string 20 if nargin == 1 21 varargout{1} = [sprintf(prolog) ... 22 print_subtree(tree,'',root(tree))]; 36 23 %- Output specified 37 else if nargin==224 else 38 25 %- Filename provided 39 if is char(filename)26 if isstr(filename) 40 27 [fid, msg] = fopen(filename,'w'); 41 if fid==-1, error(msg); end28 if fid==-1, error(msg); end 42 29 if isempty(tree.filename), tree.filename = filename; end 43 30 %- File identifier provided 44 31 elseif isnumeric(filename) & prod(size(filename)) == 1 45 32 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 48 34 else 49 35 error('[XMLTree] Invalid argument.'); 50 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 51 43 end 52 44 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 %======================================================================= 46 function 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 59 85 60 86 %======================================================================= 61 function print_subtree(tree,fid,uid,order) 62 if nargin <3, uid = root(tree); end 87 function save_subtree(tree,fid,uid,order) 63 88 if nargin < 4, order = 0; end 64 89 fprintf(fid,blanks(3*order)); … … 68 93 for i=1:length(tree.tree{uid}.attributes) 69 94 fprintf(fid,' %s="%s"',... 70 tree.tree{uid}.attributes{i}.key, ...95 tree.tree{uid}.attributes{i}.key, ... 71 96 tree.tree{uid}.attributes{i}.val); 72 97 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 79 109 case 'chardata' 80 110 fprintf(fid,'%s\n',entity(tree.tree{uid}.value)); … … 82 112 fprintf(fid,'<![CDATA[%s]]>\n',tree.tree{uid}.value); 83 113 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); 85 116 case 'comment' 86 117 fprintf(fid,'<!-- %s -->\n',tree.tree{uid}.value); 87 118 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)); 89 121 end 90 122 123 91 124 %======================================================================= 92 125 function str = entity(str) … … 95 128 str = strrep(str,'>','>'); 96 129 str = strrep(str,'"','"'); 97 str = strrep(str,' \',''');130 str = strrep(str,'''',''');
Note: See TracChangeset
for help on using the changeset viewer.