图像缩略图

struct2xml.

版本1.7.0.0 (3 KB) Wouter Falkena
将MATLAB结构转换为XML文件。
4.3
25评级

48下载

更新2012年1月2日

视图版本历史

查看许可证

此函数将MATLAB结构转换为XML文件。

引用作为

Wouter Falkena(2021)。struct2xml.(//www.tatmou.com/matlabcentral/fileexchange/28639-struct2xml), MATLAB中央文件交换。检索

意见及评分(42

亚当罗克

提示:如果你需要迭代一个内部有单元格数组的结构,(也就是这个函数所需的格式),在这里使用structree函数:
//www.tatmou.com/matlabcentral/fileexchange/31736-cell-struct-tree-and-strue-sorting.

亚当罗克

米洛斯岛Matovic

在val2str中有一个小问题,它检查ischar(val)。对于“这样的字符串”,它返回false,因此无法添加值。除此之外,工作得很好

佩德罗·杜阿尔特

Svanimisetti.

安妮Valvezan

grajcjan

你好,
脚本中的示例有点令人困惑。Matlab使用两个逗号来定义一个字符串而不是一个字符(第172行),如果代码分别使用函数val2str num2str(第175行),那么使用逗号来定义数字是不必要的。

汤姆。李

马丁韦迪森霍恩

拉克什Jasti

Laio Marinheiro

完美的工作!谢谢!

雅各布林奇八月

我添加了两种方法来提高第57行的可用性。
s = structarray2cell;
s = removeEmptyTextFields(s);

函数s =删除提取文本(s)
%防止在文本字段为空时出现以下错误,如after
% xml_struct = xml2struct(xml_file);
% struct2xml(xml_struct, xml_file);
% %使用xmlwrite出错(第82行)
Java异常:
%% java.lang.nullpointerexception.
% %
% % at com.mathworks.xml.XMLUtils.serializeXML(XMLUtils.java:192)
% %
% % at com.mathworks.xml.XMLUtils.serializeXML(XMLUtils.java:49)
% %
% %
struct2xml中的%%错误(第77行)
% % xmlwrite(文件,docNode);
切换类
例“细胞”
cellfun(…
@removeEmptyTextFields,年代,…
'统一输出',false);
例“结构”
如果是菲尔德(s,'text')
if isempty(s.Text)
s = rmfield(s, '文本');
如果%缺乏终点
如果%ISFIELD,则终端%
如果是isempty(s)||......
Isequal(s,struct())
返回;
如果%缺乏终点
structfun(…
@removeEmptyTextFields,年代,…
'统一输出',false);
否则
%什么也不做
结束%例% %开关类(年代)
% % removeEmptyTextFields函数结束

函数s = structArray2cell(s)
%避免外部函数中的num2cell(s)
切换类
例“细胞”
cellfun(…
@ structarray2cell,s,...
'统一输出',false);
例“结构”
如果是isempty(s)||......
Isequal(s,struct())
返回;
elseifiscalar(s)
structfun(…
@ structarray2cell,s,...
'统一输出',false);
Else %if ~isscalar(s)
s = structArray2cell(num2cell(s));
结束%if.
否则
%什么也不做
结束%例% %开关类(年代)
END%函数%structarray2cell

Herve Demezil

它必须是一个结构的细胞:

m代码:

< subbelem name="name3" desc="description3" number="3"/>
< subbelem name="name5" desc="description5" number="5"/>

XML:
elem.Attributes.name = '名称';
elem.Attributes.desc =“描述”;
elem.subelem {1} .Attributes.name =“name3”;
elem.subelem {1} .Attributes.desc =“description3”;
elem.subelem {1} .Attributes.number ='3';
elem.subelem {2} .Attributes.name =“name5”;
elem.subelem {2} .Attributes.desc =“description5”;
elem.subelem {2} .Attributes.number ='3';

托马斯Marullo

结构必须是什么格式?如果有嵌套结构,它似乎会中断。

Herve Demezil

用matlab r2016a替换函数"val2str()中的第166行":
str = [];
经过
str = ";

我试过了,似乎能解决

Herve Demezil

你有没有解决这个错误?

覆盖

xmlwrite。m在R2016a的82线坠毁

原因可能是“新的”Java版本与JAXP (MATLAB使用)相结合:
http://stackoverflow.com/questions/21393323/jaxb-marshaller-throwing-nullpointerexception-when-upgrading-from-java-6-to-java

阿摩司

如果结构具有空条目,则具有Java异常的Struct2XML BOMB。在早期的Matlab版本中没有发生问题。

有人能修一下吗?

superaga

Ilya Belevich

马库斯·菲舍尔

Raúl.

伟大的剧本。我不知道为什么我的struct's'没有用XML文件写入。我正在使用以下声明

文件= struct2xml(年代);

其中“文件”是我想要保存结构的XML文件和我的结构。但是,创建非XML文件。你能帮助我吗?我错过了什么?
谢谢

长叶卡特

真的很不错

弗雷德里克·

Rody Oldenhuis

格雷厄姆

谢谢!要将其提供支持逻辑字段,我金宝app拓宽了第172行(Val2str)的条件:

Elseif (isnumeric(val) || islogical(val))
val = num2str (val);

Timodörsam.

Emmanuel Farhi

非常感谢。它对我来说确实很好。

雨果

我有一个。mat文件,我需要把它转换成。xml文件。有人能帮我如何使用这个函数吗?我总是得到一个关于输入参数的错误。

Wouter Falkena

嗨哈拉尔德,

函数在主结构中需要单个字段的原因是,正确格式化的XML文档只有一个根元素(http://www.w3schools.com/xml/xml_dtd.asp).该规则的唯一例外是一个更复杂的XML序言,该函数目前不支持它。金宝app

对于第二点,XML文件通常有多个具有相同名称的元素。为了将其转换为MATLAB结构,可以使用数组。这意味着isstruct(s.(curfield))确实可能不起作用,但在那种情况下
如果iscell (s。(curfield))
MIN(Cellfun(@(a)是strist(a),s.curfield))
结尾
它会告诉你数组中的所有单元格都是结构体。

我希望这能稍微解释一下如何使用这个函数。如果您有任何问题,请随时与我联系。

问候,
韦特

哈拉尔德Berndt

看了这些评论后,我对它寄予厚望,但是……"主结构中应该有一个字段"为什么?但更糟糕的是:对于一个struct数组,调用"isstruct(s.(curfield)"会崩溃,因为返回值是一个数组!

Wouter Falkena

嗨,埃米尔,

该功能确实替换了字符 - :。使用_(也看到函数帮助)。应该可以重写替换函数:使用_colon_独特的东西,并且让struct2xml替换为:。如果您仍然需要此功能,请告诉我。结构名称确实变得更长时间......

问候,
韦特

埃米尔

伟大的脚本......只是一个问题。当我加载XML时,我注意到了xml2struct

<?xml version = " 1.0 " encoding = " utf - 8 " ?>
<正面:配方xmlns:阿德尔

然后使用struct2xml导出我得到

<?xml version = " 1.0 " encoding = " utf - 8 " ?>

将:替换为_
它似乎是弹出的,因为根和属性是结构,而在MatLab和MatLab不允许:字符的结构。

如果这不会影响文件的有效性,我可以。如果是的话,我将不得不做一些修改:(

Wouter Falkena

谢谢赫伯特寻找并成功消除这个错误。我已将固定文件上传到Matlab Central。

赫伯特Gsenger

伟大的工具。帮了很大的忙。但我发现了一个小bug。尝试转换如下内容:
a.b.Text = ";
由于val2str(…)中的错误,B = struct2xml(a)抛出一个异常。

简单的解决办法是替换

......
如果(isempty (val))
%没做什么
......

经过

如果(isempty (val))
返回;

在函数val2str(…)

Wouter Falkena

你是正确的。但是,isspace并不对单元格进行操作。在最新的更新中,我将for循环全部删除,并在多行字符串上使用isspace。这是目前最快的方法。再次感谢你们的支持。金宝app

T Lohuis

感谢Wouter对该功能的更新!

如果我错了,请纠正我,但在我的测试中,使用ISSpace的空格方法比regexprep快速快40倍。(我使用一个非常长的阵列,[148701x1双],值)

替换:
Str_cell = regexprep(tmp_cell,'[]*', ');

和:
WhiteSpace = Isspace(TMP_CELL(:));
nonspace =(空格+ [0空格(1:end-1)])〜= 2;
str_cell = tmp_cell(是非空间);

Wouter Falkena

谢谢Thijs为我的注意力带来这一点。然而,问题谎言不在regexprep中,但在for循环中。我已经改变了for循环来构建MultiLind Sting的单元格数组,并仅执行一次regexprep。来自Matlab Profiler,我获得了您的方法已更快38%。使用该单元格的Regexprep应比以前更快地为160%。我今天将上传新功能,希望明天将从Mathworks提供。再次感谢这个建议!

T Lohuis

T Lohuis

对于更长的值数组,它需要很长的处理时间!,使用这个
--
空白= isspace(tmp(我,:));
nonspace =(空格+ [0空格(1:end-1)])〜= 2;%仅删除双色空白)
STR = [STR tmp(i,nonspace) sprintf('\n')]
--

而不是:
--
str = (str regexprep (tmp(我 ,:),'[ ]*', ' ') sprintf (' \ n '));
--

但是

非常容易使用。非常感谢

菲利普•奥尔特

快速和工作就像我所期望的一切,直到现在(这不是我在Matlab中心发现的其他Struct<->XML转换的情况)。非常感谢。

MATLAB版本兼容性
使用R2008B创建
与任何版本兼容
平台兼容性
窗户 苹果系统 Linux.

社区寻宝

找到Matlab Central中的宝藏,并发现社区如何帮助您!

开始狩猎!