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/convert.m

    r821 r925  
    11function s = convert(tree,uid)
    2 % XMLTREE/CONVERT Converter an XML tree in a Matlab structure
     2% XMLTREE/CONVERT Converter an XML tree in a structure
    33%
    44% tree      - XMLTree object
     
    66%             Default is root
    77% s         - converted structure
    8 %_______________________________________________________________________
     8%__________________________________________________________________________
    99%
    10 % Convert an xmltree into a Matlab structure, when possible.
     10% Convert an XMLTree into a structure, when possible.
    1111% When several identical tags are present, a cell array is used.
    1212% The root tag is not saved in the structure.
    1313% If provided, only the structure corresponding to the subtree defined
    1414% by the uid UID is returned.
    15 %_______________________________________________________________________
    16 % @(#)convert.m                 Guillaume Flandin              02/04/11
     15%__________________________________________________________________________
     16% Copyright (C) 2002-2015  http://www.artefact.tk/
     17
     18% Guillaume Flandin
     19% $Id: convert.m 6480 2015-06-13 01:08:30Z guillaume $
    1720
    1821% Exemple:
    19 % tree: <toto><titi>field1</titi><tutu>field2</tutu><titi>field3</titi></toto>
    20 % toto = convert(tree);
    21 % <=> toto = struct('titi',{{'field1', 'field3'}},'tutu','field2')
     22% tree = '<a><b>field1</b><c>field2</c><b>field3</b></a>';
     23% toto = convert(xmltree(tree));
     24% <=> toto = struct('b',{{'field1', 'field3'}},'c','field2')
    2225
    23 error(nargchk(1,2,nargin));
     26%error(nargchk(1,2,nargin));
    2427
    2528% Get the root uid of the output structure
    2629if nargin == 1
    27         % Get the root uid of the XML tree
    28         root_uid = root(tree);
     30    % Get the root uid of the XML tree
     31    root_uid = root(tree);
    2932else
    30         % Uid provided by user
    31         root_uid = uid;
     33    % Uid provided by user
     34    root_uid = uid;
    3235end
    3336
     
    4346s = rmfield(s,'deletedummy');
    4447
    45 %=======================================================================
     48%==========================================================================
    4649function s = sub_convert(tree,s,uid,arg)
    47         type = get(tree,uid,'type');
    48         switch type
    49                 case 'element'
    50                         child = children(tree,uid);
    51                         l = {};
    52                         ll = {};
    53                         for i=1:length(child)
    54                                 if isfield(tree,child(i),'name')
    55                                         ll = { ll{:}, get(tree,child(i),'name') };
    56                                 end
    57                         end
    58                         for i=1:length(child)
    59                                 if isfield(tree,child(i),'name')
    60                                         name = get(tree,child(i),'name');
    61                                         nboccur = sum(ismember(l,name));
    62                                         nboccur2 = sum(ismember(ll,name));
    63                                         l = { l{:}, name };
    64                                         if nboccur | (nboccur2>1)
    65                                                 arg2 = { arg{:}, name, {nboccur+1} };
    66                                         else
    67                                                 arg2 = { arg{:}, name};
    68                                         end
    69                                 else
    70                                         arg2 = arg;
    71                                 end
    72                                 s = sub_convert(tree,s,child(i),arg2);
    73                         end
    74                         if isempty(child)
    75                                 s = sub_setfield(s,arg{:},'');
    76                         end
     50    type = get(tree,uid,'type');
     51    switch type
     52        case 'element'
     53            child = children(tree,uid);
     54            l = {};
     55            ll = {};
     56            for i=1:length(child)
     57                if isfield(tree,child(i),'name')
     58                    ll = { ll{:}, get(tree,child(i),'name') };
     59                end
     60            end
     61            for i=1:length(child)
     62                if isfield(tree,child(i),'name')
     63                    name = get(tree,child(i),'name');
     64                    nboccur = sum(ismember(l,name));
     65                    nboccur2 = sum(ismember(ll,name));
     66                    l = { l{:}, name };
     67                    if nboccur || (nboccur2>1)
     68                        arg2 = { arg{:}, name, {nboccur+1} };
     69                    else
     70                        arg2 = { arg{:}, name};
     71                    end
     72                else
     73                    arg2 = arg;
     74                end
     75                s = sub_convert(tree,s,child(i),arg2);
     76            end
     77            if isempty(child)
     78                s = sub_setfield(s,arg{:},'');
     79            end
    7780            %- saving attributes : does not work with <a t='q'>b</a>
    7881            %- but ok with <a t='q'><c>b</c></a>
     
    8184%                 arg2 = {arg{:} 'attributes'};       %-
    8285%                 s = sub_setfield(s,arg2{:},attrb);  %-
    83 %                         end                                     %-
    84                 case 'chardata'
    85                         s = sub_setfield(s,arg{:},get(tree,uid,'value'));
    86                         %- convert strings into their Matlab equivalent when possible
    87                         %- e.g. string '3.14159' becomes double scalar 3.14159
     86%             end                                     %-
     87        case 'chardata'
     88            s = sub_setfield(s,arg{:},get(tree,uid,'value'));
     89            %- convert strings into their numerical equivalent when possible
     90            %- e.g. string '3.14159' becomes double scalar 3.14159
    8891%             v = get(tree,uid,'value');              %-
    89 %                         cv = str2num(v);                        %-
    90 %                         if isempty(cv)                          %-
    91 %                                 s = sub_setfield(s,arg{:},v);       %-
    92 %                         else                                    %-
    93 %                                 s = sub_setfield(s,arg{:},cv);      %-
     92%             cv = str2num(v);                        %-
     93%             if isempty(cv)                          %-
     94%                 s = sub_setfield(s,arg{:},v);       %-
     95%             else                                    %-
     96%                 s = sub_setfield(s,arg{:},cv);      %-
    9497%             end                                     %-
    95                 case 'cdata'
    96                         s = sub_setfield(s,arg{:},get(tree,uid,'value'));
    97                 case 'pi'
    98                         % Processing instructions are evaluated if possible
    99                         app = get(tree,uid,'target');
    100                         switch app
    101                                 case {'matlab',''}
    102                                         s = sub_setfield(s,arg{:},eval(get(tree,uid,'value')));
    103                                 case 'unix'
    104                                         s = sub_setfield(s,arg{:},unix(get(tree,uid,'value')));
    105                                 case 'dos'
    106                                         s = sub_setfield(s,arg{:},dos(get(tree,uid,'value')));
    107                                 case 'system'
    108                                         s = sub_setfield(s,arg{:},system(get(tree,uid,'value')));
    109                                 otherwise
    110                                         try,
    111                                                 s = sub_setfield(s,arg{:},feval(app,get(tree,uid,'value')));
    112                                         catch,
    113                                                 warning('[XMLTREE] Unknown target application');
    114                                         end
    115                         end
    116                 case 'comment'
    117                         % Comments are forgotten
    118                 otherwise
    119                         warning(sprintf('Type %s unknown : not saved',get(tree,uid,'type')));
    120         end
    121        
    122 %=======================================================================
     98        case 'cdata'
     99            s = sub_setfield(s,arg{:},get(tree,uid,'value'));
     100        case 'pi'
     101            % Processing instructions are evaluated if possible
     102            app = get(tree,uid,'target');
     103            switch app
     104                case {'matlab',''}
     105                    s = sub_setfield(s,arg{:},eval(get(tree,uid,'value')));
     106                case 'unix'
     107                    s = sub_setfield(s,arg{:},unix(get(tree,uid,'value')));
     108                case 'dos'
     109                    s = sub_setfield(s,arg{:},dos(get(tree,uid,'value')));
     110                case 'system'
     111                    s = sub_setfield(s,arg{:},system(get(tree,uid,'value')));
     112                otherwise
     113                    try
     114                        s = sub_setfield(s,arg{:},feval(app,get(tree,uid,'value')));
     115                    catch
     116                        warning('[XMLTree] Unknown target application');
     117                    end
     118            end
     119        case 'comment'
     120            % Comments are forgotten
     121        otherwise
     122            warning(sprintf('Type %s unknown : not saved',get(tree,uid,'type')));
     123    end
     124   
     125%==========================================================================
    123126function s = sub_setfield(s,varargin)
    124127% Same as setfield but using '{}' rather than '()'
     
    131134    if (isa(varargin{i}, 'cell'))
    132135        types{i} = '{}';
    133     elseif isstr(varargin{i})
     136    elseif ischar(varargin{i})
    134137        types{i} = '.';
    135138        subs{i} = varargin{i}; %strrep(varargin{i},' ',''); % deblank field name
Note: See TracChangeset for help on using the changeset viewer.