Mercurial > hg > ltpda
view m-toolbox/classes/+utils/@xml/xmlread.m @ 49:0bcdf74587d1 database-connection-manager
Cleanup
author | Daniele Nicolodi <nicolodi@science.unitn.it> |
---|---|
date | Wed, 07 Dec 2011 17:24:36 +0100 |
parents | f0afece42f48 |
children |
line wrap: on
line source
% XMLREAD Reads a XML object %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DESCRIPTION: XMLREAD Reads a XML object. % % CALL: obj = xmlread(node); % obj = xmlread(node ,'class'); % obj = xmlread(node ,'ao'); % obj = xmlread(node ,'time'); % % XML HIERARCHY: ---------------------- ltpda_object ---------------------- % % <ltpda_object> % % --> <object> ... % --> <cell> ... % % </ltpda_object> % % ------------------------- object ------------------------- % % <object> ('type' - attribute) % % <property> ... % % </object> % % ------------------------ property ------------------------ % -------------------------- cell -------------------------- % % <property> ('type', 'prop_name' -attributes) % OR <cell> ('type' -attribute) % % --> atomic element % - empty cell % - empty double % - empty char % - char % - double % - logical % - java (necessary for timezone) % --> <cell> ... % --> <object> ... % --> <real_data> ... % <imag_data> ... % % </property> % OR </cell> % % ------- real_data --------|-------- imag_data -------- % | % <real_data>('type'-attribute) | <imag_data> ('type' -attribute) % ('shape'-attribute)| ('shape'-attribute) % | % --> <matrix> ... | --> <matrix> ... % --> <vector> ... | --> <vector> ... % | % </real_data> | </imag_data> % | % --------- matrix -------------------- vector --------- % | % <matrix> ('type' -attribute) | <vector> ('type' -attribute) % | % row vector (double) | column vector (double) % | % </matrix> | </vector> % % SYMBOLS: --> Marks a choice between alternatives. % ... Indicate that an element may be repeated. % % VERSION: $Id: xmlread.m,v 1.8 2011/03/28 17:04:27 ingo Exp $ % % HISTORY: 31-01-2008 Diepholz % Creation % % SEE ALSO: utils.xml.xmlwrite % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function values = xmlread(rootNode, obj_name) % if nargin == 1 % node_name = mchar(rootNode.getNodeName); % % switch node_name % case 'ltpda_object' % % % Get the xml version from the document node % % node.getOwnerDocument.item(0).hasAttribute('ltpda_version') % if rootNode.hasAttribute('ltpda_version') % xml_ver = strtok(mchar(rootNode.getAttribute('ltpda_version'))); % else % xml_ver = '1.0'; % end % % tbx_ver = strtok(getappdata(0, 'ltpda_version')); % % % set the application data 'xml_ver' if the xml version is lower than the % % toolbox version. % % This application data is nedded in the function xml_read_object to % % update the object string. % if utils.helper.ver2num(xml_ver) < utils.helper.ver2num(tbx_ver) % update = xml_ver; % else % update = ''; % end % % values = xml_read_ltpda_object(rootNode, update); % case 'object' % values = xml_read_object(rootNode, false); % case 'property' % values = xml_read_property_cell(rootNode, false); % case 'cell' % values = xml_read_property_cell(rootNode, false); % case 'real_data' % values = xml_read_real_imag_data(rootNode); % case 'imag_data' % values = xml_read_real_imag_data(rootNode); % case 'matrix' % %%%%% row vector % values = sscanf(mchar(child_node.getTextContent), '%g ', [1,inf]); % case 'vector' % %%%%% column vector % values = sscanf(mchar(child_node.getTextContent), '%g '); % otherwise % %%%%% Search for the next valid node name. % for ii = 1:rootNode.getLength % item = rootNode.item(ii-1); % if item.hasChildNodes % values = utils.xml.xmlread(item); % end % end % end if nargin >= 1 values = []; valuesShape = []; h = history.initObjectWithSize(1,0); queryNode = rootNode.getElementsByTagName('ltpda_object'); for ii= 1:queryNode.getLength LTPDANode = queryNode.item(ii-1); if LTPDANode.getNodeType == LTPDANode.ELEMENT_NODE if LTPDANode.hasAttribute('ltpda_version') ltpda_version = strtok(utils.xml.mchar(LTPDANode.getAttribute('ltpda_version'))); else ltpda_version = '1.0'; end if (utils.helper.ver2num(ltpda_version) > utils.helper.ver2num('2.3')) || ... (strcmp(strtok(ltpda_version), '2.3')) %%%%%%%%%%%%%%%%%% reading of a new XML file %%%%%%%%%%%%%%%%%% for jj = 1:LTPDANode.getLength objNode = LTPDANode.item(jj-1); if objNode.getNodeType == objNode.ELEMENT_NODE className = utils.xml.mchar(objNode.getNodeName()); if strcmp(className, 'historyRoot') h = history(objNode, history.initObjectWithSize(1,0)); else valuesShape = utils.xml.getShape(objNode); val = feval(className, objNode, h); if ~exist('obj_name', 'var') || strcmp(class(val), obj_name) values = [values val]; else error('### Skip the read object because it is from the class [%s] and not from the class [%s].', class(val), obj_name); end end end end values = reshape(values, valuesShape); else %%%%%%%%%%%%%%%%%% reading of a old XML file %%%%%%%%%%%%%%%%%% for jj = 1:LTPDANode.getLength objNode = LTPDANode.item(jj-1); if objNode.hasChildNodes % Get node name node_name = utils.xml.mchar(objNode.getNodeName); switch node_name case 'object' val = xml_read_object(objNode, ltpda_version); if isempty(valuesShape), valuesShape = getShape(objNode); end if ~exist('obj_name', 'var') || strcmp(class(val), obj_name) values = [values val]; else error('### Skip the read object because it is from the class [%s] and not from the class [%s].', class(val), obj_name); end otherwise end end end % over all childs if ~isempty(valuesShape) values = reshape(values, valuesShape); end end end % LTPDANode.ELEMENT_NODE end % ii= 1:queryNode.getLength else error('### Invalid command of this function'); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DESCRIPTION: XML_READ_LTPDA_OBJECT Reads a ltoda_object element with the form: % % <ltpda_object> % % --> <object> ... % --> <cell> ... % % </ltpda_object> % % SYMBOLS: --> Marks a choice between alternatives. % ... Indicate that an element may be repeated. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function values = xml_read_ltpda_object(node, update) values = []; for ii = 1:node.getLength child_node = node.item(ii-1); if child_node.hasChildNodes % Get Node name node_name = mchar(child_node.getNodeName); switch node_name case 'object' values = [values xml_read_object(child_node, update)]; case 'cell' values{end+1} = xml_read_property_cell(child_node, update); otherwise error('### The ''ltpda_object'' element can not contain a [%s] element.', node_name); end end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DESCRIPTION: XML_READ_OBJECT Reads a object element with the form: % % <object> ('type' - attribute) % % <property> ... % % </object> % % SYMBOLS: ... Indicate that an element may be repeated. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function obj = xml_read_object(node, update) obj_type = mchar(node.getAttribute('type')); obj = []; % Set some properties which are stored in the attributes of the 'object' node obj = getSpecialObjectAttributes(obj, node, update); for ii = 1:node.getLength child_node = node.item(ii-1); %%% Read only the property if the node is a ELEMENT_NODE. if child_node.getNodeType == child_node.ELEMENT_NODE % Get node name node_name = mchar(child_node.getNodeName); % get property name from the attribute 'prop_name' prop_name = mchar(child_node.getAttribute('prop_name')); switch node_name case 'property' prop_value = xml_read_property_cell(child_node, update); try obj.(prop_name) = prop_value; catch warning('\n\n### Skip the unknown property [%s] in the object [%s]\n', prop_name, class(obj)); disp([char(10) 'Code me up to convert me into the new structure !!!' char(10) ]); end otherwise error('### The ''object'' element can not contain a [%s] element.', node_name); end end end if isempty(update) % Make sure that the version we want to update to is far in the future. % In other words, we don't do an update if it's not necessary. update = '1000000000000000'; else old_c = {'timeformat', 'pole', 'zero'}; new_c = {'', 'pz', 'pz'}; idx = strmatch(obj_type, char(old_c), 'exact'); if ~isempty(idx) obj_type = new_c{idx}; end % if ~isempty(obj_type) % % Update the structure to the current ltpda_version % update_fcn = [obj_type '.update_struct']; % obj = feval(update_fcn, obj, update); % end end if ~isempty(obj_type) && ~strcmp(obj_type, 'struct') obj.class = obj_type; obj.tbxver = update; obj = feval(obj_type, obj); elseif isempty(obj) && strcmp(obj_type, 'struct') obj = struct(); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DESCRIPTION: XML_READ_PROPERTY_CELL Reads a property element or a cell element % with the form: % % <property> ('type', 'prop_name' -attributes) % OR: <cell> ('type' -attribute) % % --> atomic element % - empty cell % - empty double % - empty char % - char % - double % - logical % - java (necessary for timezone) % --> <cell> ... % --> <object> ... % --> <real_data> ... % <imag_data> ... % % </property> % OR: </cell> % % SYMBOLS: --> Marks a choice between alternatives. % ... Indicate that an element may be repeated. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function prop_value = xml_read_property_cell(node, update) prop_value = []; real_value = []; imag_value = []; shape = []; %%% Is the length of the node is equal 1 or zero %%% then is the property a atomic element if node.getLength == 0 || node.getLength == 1 prop_value = xml_read_atomic_element(node); return end for ii = 1:node.getLength child_node = node.item(ii-1); if child_node.getNodeType == child_node.ELEMENT_NODE %%% Get the node name node_name = mchar(child_node.getNodeName); switch node_name case 'cell' if isempty(shape), shape = getShape(node); end prop_value{end+1} = xml_read_property_cell(child_node, update); case 'object' if isempty(shape), shape = getShape(child_node); end prop_value = [prop_value xml_read_object(child_node, update)]; case 'real_data' real_value = xml_read_real_imag_data(child_node); case 'imag_data' imag_value = xml_read_real_imag_data(child_node); otherwise error('### The ''property'' or ''cell'' element can not contain a [%s] element.', node_name); end %%% Is real_value and imag_value filled then return the complex value if ~isempty(real_value) && ~isempty(imag_value) prop_value = complex(real_value, imag_value); %%% Is real_value filled then return the read value elseif ~isempty(real_value) prop_value = real_value; end end end %%% Reshape the prop_value if necessary if ~isempty(shape) prop_value = reshape(prop_value, shape); end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DESCRIPTION: XML_READ_REAL_IMAG_DATA Reads a real_data element or a % imag_data element with the form: % % <real_data> ('type' -attribute) <imag_data> ('type' -attribute) % ('shape'-attribute) ('shape'-attribute) % % --> <matrix> ... --> <matrix> ... % --> <vector> ... --> <vector> ... % % </real_data> </imag_data> % % <matrix> ('type' -attribute) <vector> ('type' -attribute) % % row vector (double) column vector (double) % % </matrix> </vector> % % SYMBOLS: --> Marks a choice between alternatives. % ... Indicate that an element may be repeated. % % REMARK: The matrix elements will be read as a row vector. % The vector elements will be read as a column vector. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function value = xml_read_real_imag_data(node) value = []; header_displayed = true; %%% Get the shape of the matrix/vector shape = getShape(node); % value = zeros(shape); % idx = 1; node_name = ''; for ii = 1:node.getLength child_node = node.item(ii-1); if child_node.hasChildNodes %%% Get node name node_name = mchar(child_node.getNodeName); %%% Get type node_type = mchar(child_node.getAttribute('type')); switch node_name case 'matrix' %%% row vector if strcmp(node_type, 'sym') matrix_row = sym(mchar(child_node.getTextContent)); else matrix_row = sscanf(mchar(child_node.getTextContent), '%g ', [1,inf]); end value = [value; matrix_row]; % value(idx,:) = matrix_row; % idx = idx + 1; case 'vector' %%% column vector if strcmp(node_type, 'sym') vector_column = sym(mchar(child_node.getTextContent)); else vector_column = sscanf(mchar(child_node.getTextContent), '%g '); end value = [value; vector_column]; % value(idx:idx + length(vector_column) - 1) = vector_column; % idx = idx + length(vector_column); header_displayed = TerminalOutput(node, header_displayed, node_name, length(value)); otherwise error('### The ''real_data'' or ''imag_data'' element can not contain a [%s] element.', node_name); end end end if strcmp(node_name, 'matrix') header_displayed = true; TerminalOutput(node, header_displayed, node_name, size(value,1)); end value = reshape(value, shape); end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % DESCRIPTION: xml_read_atomic_element Reads a atomic element. % This function identify the following types: % --> atomic element % - empty cell % - empty double % - empty char % - char % - double % - logical % - java (necessary for timezone) % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function values = xml_read_atomic_element(node) values = ''; type = mchar(node.getAttribute('type')); switch type case {'', 'char'} shape = getShape(node); if (any(shape==1)) values = mchar(node.getTextContent); else values = reshape(mchar(node.getTextContent), shape); end values = strrep(values, '<NEW_LINE>', '\n'); values = strrep(values, 'CVS_TAG', '$'); %%% Special case if 'values' is empty because %%% there are more than an one empty char fields. %%% For example: '' AND char('', '') AND char('', '', '') AND ... if isempty(values) if any(shape) char_str = 'char('; for ii = 1:max(shape) char_str = [char_str, ''''', ']; end char_str = char_str(1:end-2); cmd = strcat('values = ', char_str, ');'); eval(cmd); else values = ''; end end case {'double', 'uint64', 'uint32', 'int32', 'int64'} number = mchar(node.getTextContent); %%% Special case if 'values' is empty because %%% there are more than an one empty double fields. %%% For example: [] AND zeros(1,0) AND zeros(0,1) AND zeros(2,0) AND ... if isempty(number) shape = getShape(node); values = zeros(shape); else values = str2double(number); end % cast to other number type if strcmp(type, 'uint64') values = uint64(values); elseif strcmp(type, 'uint32') values = uint32(values); elseif strcmp(type, 'int64') values = int64(values); elseif strcmp(type, 'int32') values = int32(values); end case 'sym' number = mchar(node.getTextContent); %%% Special case if 'values' is empty because %%% there are more than an one empty double fields. %%% For example: [] AND zeros(1,0) AND zeros(0,1) AND zeros(2,0) AND ... if isempty(number) shape = getShape(node); values = sym(shape); else values = sym(number); end case 'cell' cell_str = mchar(node.getTextContent); %%% Special case if 'values' is empty because %%% there are more than an one empty cell fields. %%% For example: {} AND cell(1,0) AND cell(0,1) AND cell(2,0) AND ... if isempty(cell_str) shape = getShape(node); values = cell(shape); else error('### Should not happen because a not empty ''cell'' node have several child nodes.'); end case 'logical' cmd = ['logical(' mchar(node.getTextContent) ');']; values = eval(cmd); case 'sun.util.calendar.ZoneInfo' values = java.util.TimeZone.getTimeZone(mchar(node.getTextContent)); otherwise if any(strcmp(utils.helper.ltpda_non_abstract_classes, type)) %%% Special case for reading an object with the size Nx0 or 0xN shape = getShape(node); cmd = sprintf('%s.initObjectWithSize', type); values = feval(cmd, shape(1), shape(2)); else error('### Unknown type attribute [%s].', type'); end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % FUNCTION: shape = getShape(node) % % INPUTS: node - A DOM node with an attribute 'shape' % % DESCRIPTION: getShape Helper function to get the shape from the % attribute 'shape' as a set of double. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function shape = getShape(node) shape = [NaN NaN]; if node.hasAttribute('shape') shape_str = mchar(node.getAttribute('shape')); x_idx = strfind(shape_str, 'x'); shape = [str2double(shape_str(1:x_idx-1)) str2double(shape_str(x_idx+1:end))]; end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % FUNCTION: obj = getSpecialObjectAttributes(obj, node) % % INPUTS: obj - a object structure or empty array % node - A DOM node with the node name 'object' % % DESCRIPTION: % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function obj = getSpecialObjectAttributes(obj, node, update) if strcmp(mchar(node.getNodeName), 'object') if strcmp(mchar(node.getAttribute('type')), 'time') % Get attributes for a time object % Check if the attribute exist (necessary for backwards compability) if (node.hasAttribute('utc')) obj.utc_epoch_milli = str2double(mchar(node.getAttribute('utc'))); obj.timezone = java.util.TimeZone.getTimeZone(mchar(node.getAttribute('timezone'))); obj.timeformat = mchar(node.getAttribute('timeformat')); end elseif strcmp(mchar(node.getAttribute('type')), 'provenance') % Get attributes for a provenance object % Check if the attribute exist (necessary for backwards compability) if (node.hasAttribute('info')) objStr = mchar(node.getAttribute('info')); obj = provenance.setFromEncodedInfo(obj, objStr); end elseif strcmp(mchar(node.getAttribute('type')), 'minfo') % Get attributes for a minfo object % Check if the attribute exist (necessary for backwards compability) if (node.hasAttribute('info')) objStr = mchar(node.getAttribute('info')); obj = minfo.setFromEncodedInfo(obj, objStr); end elseif strcmp(mchar(node.getAttribute('type')), 'param') % Get attributes for a param object % Check if the attribute exist (necessary for backwards compability) if (node.hasAttribute('key')) obj.key = mchar(node.getAttribute('key')); for ii = 1:node.getLength childNode = node.item(ii-1); %%% Read only the property if the node is a ELEMENT_NODE. if childNode.getNodeType == childNode.ELEMENT_NODE obj.val = xml_read_property_cell(childNode, update); end end end else % Get general attributes. if node.hasAttribute('name') obj.name = mchar(node.getAttribute('name')); end if node.hasAttribute('description') obj.description = mchar(node.getAttribute('description')); end if node.hasAttribute('UUID') obj.UUID = mchar(node.getAttribute('UUID')); end if node.hasAttribute('created') obj.created = str2double(mchar(node.getAttribute('created'))); end if node.hasAttribute('proctime') obj.proctime = str2double(mchar(node.getAttribute('proctime'))); end end end end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % FUNCTION: header_displayed = TerminalOutput(node, header_displayed, node_name, number) % % DESCRIPTION: Displays the terminal output. % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% function header_displayed = TerminalOutput(node, header_displayed, node_name, number) import utils.const.* THRESHOLD_DISP_MATRIX = 10; THRESHOLD_DISP_VECTOR = 1000; showing = false; if strcmp(node_name, 'matrix') if number >= THRESHOLD_DISP_MATRIX showing = true; add_text = 'matrix lines'; end else if number >= THRESHOLD_DISP_VECTOR showing = true; add_text = 'data samples'; end end if showing == true parent = node.getParentNode; % The parent node have the 'property name' information if header_displayed == true if parent.hasAttribute('prop_name') disp_prop_name = mchar(parent.getAttribute('prop_name')); else disp_prop_name = 'Unknown Property Name'; end utils.helper.msg(msg.PROC2, 'Reading property: %s', disp_prop_name); if strcmp(mchar(node.getNodeName), 'real_data') utils.helper.msg(msg.PROC2, 'Reading real data'); else utils.helper.msg(msg.PROC2, 'Reading imag data'); end header_displayed = false; end utils.helper.msg(msg.PROC2, 'Read %d %s', number, add_text); end end function c = mchar(s) c = cell(s); c = c{1}; end