Matlab中使用xml2struct转换XML为结构体时遇异常问题求助
解决Matlab中xml2struct生成#text子节点的问题
嘿,我太懂你用Matlab的xml2struct时碰到#text子节点的糟心了!明明想要把XML里的字符串直接当成数据,结果被这个额外的节点套了一层,还带一堆多余的空格换行,简直头疼。我之前也踩过这个坑,给你分享几个实用的解决办法:
1. 先给XML做“大扫除”(预处理清理空白)
很多时候#text节点里的多余符号,都是XML文件里的换行、缩进空格搞的鬼。先把这些无关空白清掉再转换,能解决大半问题:
% 读取XML文件内容 xmlContent = fileread('你的XML文件名.xml'); % 去掉标签之间的换行、多余空格(比如<item> paper </item>变成<item>paper</item>) xmlContent = regexprep(xmlContent, '>\s+<', '><'); % 去掉文本首尾的空白 xmlContent = strtrim(xmlContent); % 再用xml2struct处理清理后的内容 xmlStruct = xml2struct(xmlContent);
2. 给转换后的结构体“瘦身”(递归清理#text节点)
如果预处理后还是有#text节点,那就写个小工具函数,递归遍历结构体,把单独的#text节点直接替换成干净的文本内容:
function cleanedStruct = cleanXmlStruct(xmlStruct) fields = fieldnames(xmlStruct); for i = 1:length(fields) field = fields{i}; % 递归处理子结构体 if isstruct(xmlStruct.(field)) xmlStruct.(field) = cleanXmlStruct(xmlStruct.(field)); % 如果这个子结构体只有#text一个字段,直接替换成文本 if length(fieldnames(xmlStruct.(field))) == 1 && isfield(xmlStruct.(field), '#text') xmlStruct.(field) = strtrim(xmlStruct.(field).('#text')); end % 处理数组形式的节点(比如多个同标签的情况) elseif iscell(xmlStruct.(field)) for j = 1:length(xmlStruct.(field)) xmlStruct.(field){j} = cleanXmlStruct(xmlStruct.(field){j}); end end end cleanedStruct = xmlStruct; end
用法超简单:
% 先得到原始转换后的结构体 originalStruct = xml2struct('你的XML文件名.xml'); % 清理后得到干净的结构体 cleanedStruct = cleanXmlStruct(originalStruct);
3. 换用Matlab原生XML工具(彻底掌控解析过程)
其实Matlab自带xmlread工具,完全可以自己解析XML,避免第三方xml2struct的“奇怪行为”。比如要提取某个节点的文本:
% 读取XML文档 xmlDoc = xmlread('你的XML文件名.xml'); % 找到目标节点(比如<item>节点,这里假设是第一个) targetNode = xmlDoc.getElementsByTagName('item').item(0); % 提取文本并清理空白 textContent = strtrim(char(targetNode.getFirstChild.getNodeValue()));
如果需要转换成结构体,也可以自己写个递归解析函数,完全按照你的需求来构建结构,再也不会出现莫名其妙的#text节点啦!
内容的提问来源于stack exchange,提问作者Abotric




