[ismrmrd] 150/177: First crappy version of matlab xml deserialize function.
Ghislain Vaillant
ghisvail-guest at moszumanska.debian.org
Wed Jan 14 20:02:13 UTC 2015
This is an automated email from the git hooks/post-receive script.
ghisvail-guest pushed a commit to annotated tag v1.1.0.beta.1
in repository ismrmrd.
commit 3953491008e0391fd0d6287c7b37aa37a850963a
Author: Souheil Inati <souheil.inati at nih.gov>
Date: Tue Oct 21 15:18:04 2014 -0400
First crappy version of matlab xml deserialize function.
---
matlab/+ismrmrd/+xml/deserialize.m | 145 +++++++++++++++++++++++++++++++++++++
1 file changed, 145 insertions(+)
diff --git a/matlab/+ismrmrd/+xml/deserialize.m b/matlab/+ismrmrd/+xml/deserialize.m
new file mode 100644
index 0000000..14f1606
--- /dev/null
+++ b/matlab/+ismrmrd/+xml/deserialize.m
@@ -0,0 +1,145 @@
+function [header] = deserialize(xmlstring)
+%DESERIALIZE Summary of this function goes here
+% Detailed explanation goes here
+
+% Get a parser
+db = javax.xml.parsers.DocumentBuilderFactory.newInstance().newDocumentBuilder();
+
+% Turn the string into a stream
+isrc = org.xml.sax.InputSource();
+isrc.setCharacterStream(java.io.StringReader(xmlstring))
+
+% Parse it
+dom = db.parse(isrc);
+
+% Get the root element
+rootNode = dom.getDocumentElement();
+
+% Loop through and fill
+header = parseChildNodes(rootNode);
+
+end
+
+% ----- Subfunction parseChildNodes -----
+function [children,ptext,textflag] = parseChildNodes(theNode)
+ % Recurse over node children.
+ children = struct;
+ ptext = struct; textflag = 'Text';
+ if hasChildNodes(theNode)
+ childNodes = getChildNodes(theNode);
+ numChildNodes = getLength(childNodes);
+
+ for count = 1:numChildNodes
+ theChild = item(childNodes,count-1);
+ [text,name,attr,childs,textflag] = getNodeData(theChild);
+
+ if (~strcmp(name,'#text') && ~strcmp(name,'#comment') && ~strcmp(name,'#cdata_dash_section'))
+ %XML allows the same elements to be defined multiple times,
+ %put each in a different cell
+ if (isfield(children,name))
+ if (~iscell(children.(name)))
+ %put existsing element into cell format
+ children.(name) = {children.(name)};
+ end
+ index = length(children.(name))+1;
+ %add new element
+ children.(name){index} = childs;
+ if(~isempty(fieldnames(text)))
+ children.(name){index} = text;
+ end
+ if(~isempty(attr))
+ children.(name){index}.('Attributes') = attr;
+ end
+ else
+ %add previously unknown (new) element to the structure
+ children.(name) = childs;
+ if(~isempty(text) && ~isempty(fieldnames(text)))
+ children.(name) = text;
+ end
+ if(~isempty(attr))
+ children.(name).('Attributes') = attr;
+ end
+ end
+ else
+ ptextflag = 'Text';
+ if (strcmp(name, '#cdata_dash_section'))
+ ptextflag = 'CDATA';
+ elseif (strcmp(name, '#comment'))
+ ptextflag = 'Comment';
+ end
+
+ %this is the text in an element (i.e., the parentNode)
+ if (~isempty(regexprep(text.(textflag),'[\s]*','')))
+ if (~isfield(ptext,ptextflag) || isempty(ptext.(ptextflag)))
+ ptext.(ptextflag) = text.(textflag);
+ else
+ %what to do when element data is as follows:
+ %<element>Text <!--Comment--> More text</element>
+
+ %put the text in different cells:
+ % if (~iscell(ptext)) ptext = {ptext}; end
+ % ptext{length(ptext)+1} = text;
+
+ %just append the text
+ ptext.(ptextflag) = [ptext.(ptextflag) text.(textflag)];
+ end
+ end
+ end
+
+ end
+ end
+end
+
+% ----- Subfunction getNodeData -----
+function [text,name,attr,childs,textflag] = getNodeData(theNode)
+ % Create structure of node info.
+
+ %make sure name is allowed as structure name
+ name = toCharArray(getNodeName(theNode))';
+ name = strrep(name, '-', '_dash_');
+ name = strrep(name, ':', '_colon_');
+ name = strrep(name, '.', '_dot_');
+
+ attr = parseAttributes(theNode);
+ if (isempty(fieldnames(attr)))
+ attr = [];
+ end
+
+ %parse child nodes
+ [childs,text,textflag] = parseChildNodes(theNode);
+
+ if (isempty(fieldnames(childs)) && isempty(fieldnames(text)))
+ %get the data of any childless nodes
+ % faster than if any(strcmp(methods(theNode), 'getData'))
+ % no need to try-catch (?)
+ % faster than text = char(getData(theNode));
+ text.(textflag) = toCharArray(getTextContent(theNode))';
+ end
+
+end
+
+% ----- Subfunction parseAttributes -----
+function attributes = parseAttributes(theNode)
+ % Create attributes structure.
+
+ attributes = struct;
+ if hasAttributes(theNode)
+ theAttributes = getAttributes(theNode);
+ numAttributes = getLength(theAttributes);
+
+ for count = 1:numAttributes
+ %attrib = item(theAttributes,count-1);
+ %attr_name = regexprep(char(getName(attrib)),'[-:.]','_');
+ %attributes.(attr_name) = char(getValue(attrib));
+
+ %Suggestion of Adrian Wanner
+ str = toCharArray(toString(item(theAttributes,count-1)))';
+ k = strfind(str,'=');
+ attr_name = str(1:(k(1)-1));
+ attr_name = strrep(attr_name, '-', '_dash_');
+ attr_name = strrep(attr_name, ':', '_colon_');
+ attr_name = strrep(attr_name, '.', '_dot_');
+ attributes.(attr_name) = str((k(1)+2):(end-1));
+ end
+ end
+end
\ No newline at end of file
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/debian-science/packages/ismrmrd.git
More information about the debian-science-commits
mailing list