⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfbox_xml2mat.m

📁 toolbox for spm 5 for data, model free analysis
💻 M
字号:
function [mat,varname,tag_contents]=mfbox_xml2mat(xml)% Copyright by Peter Gruber % Signal Processing & Information Theory group% Institute of Biophysics, University of Regensburg, Germany% Homepage: http://research.fabian.theis.name%           http://www-aglang.uni-regensburg.de%% This file is free software, subject to the % GNU GENERAL PUBLIC LICENSE, see gpl.txt% xml2mat converts xml string into matlab structure variable%% inpired by Jonas Almeida, 20 Aug 2002, xml4mat Tboxxml = regexprep(xml,'<[?!].*?>','');tag_ini = find(xml=='<');tag_end = find(xml=='>');n = length(tag_ini);if (length(tag_end)~=n)    mat = {};    varname = [];    tag_contents = [];    returnendif (n>0)    tag_contents = cell(n,4);    for i=1:n        tag_contents{i,3} = (xml(tag_ini(i)+1)=='/'); % 1 for closing contents and 0 for opening        tag_contents{i,1} = xml(tag_ini(i)+1+tag_contents{i,3}:tag_end(i)-1);  % first column contains names        tag_contents{i,2} = mfbox_xml2whos(tag_contents{i,1});    end    a = cumsum(1-cat(1,tag_contents{:,3}));    b = cumsum(cat(1,tag_contents{:,3}));    a(2:end) = a(2:end)-b(1:(end-1));    tag_level = a;    tag_contents(:,4) = mat2cell(tag_level,ones(1,n),1);    if (tag_level(1)~=1 || tag_level(end)~=1 || any(tag_level<1) || sum(tag_level==1)~=2)        warning('Inconsistent tags');        mat = [];        varname = '';        return    end    varname = tag_contents{1,2}.name;    mat = parsetags(tag_contents,tag_ini,tag_end,xml);else    mat = {};    varname = [];    tag_contents = [];endreturnfunction mat=parsetags(tc,ti,te,xml)n = size(tc,1);if (~strcmp(tc{1,2}.class,tc{n,2}.class))    warning('Inconsistent opening/closing tag %s,%s', ...        tc{1,2}.class,tc{n,2}.class);    mat = [];    return;endif (strcmp(tc{1,2}.class,'mfbox'))    lvl = tc{1,4};    lvls = find(cat(1,tc{:,4})==(lvl+1));    if (mod(length(lvls),2)~=0)        warning('unbalanced tags');        return;    end    p = reshape(cat(1,tc{lvls,3}),2,[]);    if (size(p,2)>1)        warning('may only contain one element');        return;    end    lvls = reshape(lvls,2,[]);    f = lvls(1,1);    t = lvls(2,1);    ntc = tc(f:t,:);    mat = parsetags(ntc,ti(f:t),te(f:t),xml);elseif (strcmp(tc{1,2}.class,'char'))    mat = '';    if (n~=2)        warning('cant nest chars');        return;    end    mat = spcharout(strip(xml((te(1)+1):(ti(2)-1))));elseif (strcmp(tc{1,2}.class,'struct'))    mat = struct();    s = tc{1,2}.size;    lvl = tc{1,4};    lvls = find(cat(1,tc{:,4})==(lvl+1));    if (mod(length(lvls),2)~=0)        warning('unbalanced tags');        return;    end    p = reshape(cat(1,tc{lvls,3}),2,[]);    if (any(p(1,:)) || any(~p(2,:)))        warning('not pairwise tags');        return;    end    lvls = reshape(lvls,2,[]);    v = cell(size(p,2),1);    fn = cell(size(p,2),1);    for i=1:size(p,2)        f = lvls(1,i);        t = lvls(2,i);        ntc = tc(f:t,:);        v{i} = parsetags(ntc,ti(f:t),te(f:t),xml);        fn{i} = ntc{1,2}.name;    end    [ufn,p,q] = unique(fn);    p = accumarray(q,ones(size(q)),[max(q'),1]);    if ((length(ufn)*prod(s))~=size(lvls,2) || any(p~=prod(s)))        warning('incompatible size');        return;    end    k = 1;    for i=1:prod(s)        for j=1:length(ufn)            mat(i).(fn{k}) = v{k};            k = k+1;        end    end    mat = reshape(mat,s);elseif (strcmp(tc{1,2}.class,'cell'))    mat = cell(tc{1,2}.size);    lvl = tc{1,4};    lvls = find(cat(1,tc{:,4})==(lvl+1));    if (mod(length(lvls),2)~=0)        warning('unbalanced tags');        return;    end    p = reshape(cat(1,tc{lvls,3}),2,[]);    if (any(p(1,:)) || any(~p(2,:)))        warning('not pairwise tags');        return;    end    lvls = reshape(lvls,2,[]);    for i=1:size(p,2)        f = lvls(1,i);        t = lvls(2,i);        ntc = tc(f:t,:);        mat{i} = parsetags(ntc,ti(f:t),te(f:t),xml);    endelse    mat = [];    if (n~=2)        warning('cant nest numeric');        return;    end    mat = str2num(strip(xml((te(1)+1):(ti(2)-1))));    if (strcmp(tc{1,2}.class,'int32'))        mat = int32(mat);    elseif (strcmp(tc{1,2}.class,'int16'))        mat = int16(mat);    elseif (strcmp(tc{1,2}.class,'logical'))        mat = logical(mat);    end    mat = reshape(mat,tc{1,2}.size);endfunction b=strip(b)spc = isspace(b(:));if (all(~spc))    returnende = length(b);s = find(~spc,1);e = e+1-find(~spc(end:-1:s),1);b = b(s:e);function y=spcharout(x)if (iscell(x))    y = cellfun(x,@spcharout);elseif (ischar(x))    y = eval(['[''',regexprep(x,'\#(\d+);',''',char($1),'''),''']']);else    w = whos('x')    error('string expected %s found instead',w.class);end

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -