You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动