📄 mfbox_xml2mat.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 + -