2012-09-12 47 views
0

我有这样一个构造函数:MATLAB:如何使用由字符串定义的名称创建结构字段。

function p = class_name(folder, file_name) 

    xmlfile = fullfile(folder, file_name); 
    xDoc = xmlread(xmlfile); 

     struct = xml2struct(xDoc); 

     %lots of repetitive code 

end 

它读取和XML文件,并将其转换为一个结构。

if(isfield(struct.parameters, 'parameter_name')) 
    p.property_name = struct.parameters.parameter_name.Text; 
else 
    p.property_name = ''; 
end 

我希望把这个变成一个方法/函数,给定的结构元素的名称(这里“PARAMETER_NAME:然后,将结构元素使用的是一些重复的代码是这样定义的类的属性/领域')和类字段/属性的名称(这里是'property_name')将前者指定给后者。

是否可以为此编写一个通用函数/方法?谢谢。

回答

4

您可以使用动态字段名称来实现这样的功能。这是此类案件的recommended实现:

function p = setparam(s, p, param_name, prop_name) 
    if(isfield(s.parameters, param_name)) 
     param = s.parameters.(param_name); 
     p.(prop_name) = param.Text; 
    else 
     p.(prop_name) = ''; 
    end 
end 

您还可以使用setfield和getfield命令在旧版本的MATLAB的:

function p = setparam(s, p, param_name, prop_name) 
    if(isfield(s.parameters, param_name)) 
     param = getfield(s.parameters, param_name); 
     p = setfield(p, prop_name, getfield(param, 'Text')); 
    else 
     p = setfield(p, prop_name, ''); 
    end 
end 

不要使用结构的名字结构在你的代码 - 这是一个保留关键字。

+0

我收到警告。使用结构而不是getfield/setfield的动态字段名称。我想这就是尼克正在做的事情。你能否调整你的代码?谢谢。 – cs0815

+0

@csetzkorn我已经更新了代码。你使用的是什么MATLAB版本?我没有收到警告。无论如何,解释为什么使用动态字段而不是getfield/setfield是一些性能优势。当然,在你的代码中它是否重要取决于你是否需要检查。但是摆脱警告绝对是使用动态字段的一个很好的理由。 – angainor

0

使用动态字段名:

yourStruct.parameters.('parameter_name') 
0

这里是AA泛型函数: 可用于任何结构或类对象

function obj_to = set_props(obj_to, obj_from) 
% insert properties from obj_from into obj_to. 
props_from = fieldnames(obj_from); 
props_to = fieldnames(obj_to); 
for k = 1 : length(props_to) 
    if ismember(props_to{k}, props_from) 
     obj_to.(props_to{k}) = obj_from.(props_to{k}); 
    else 
     obj_to.(props_to{k}) = ''; 
    end 
end 

现在,在构造函数中:

function obj = class_name(folder, file_name) 
    xmlfile = fullfile(folder, file_name); 
    xDoc = xmlread(xmlfile); 
    s = xml2struct(xDoc); % do not use word "struct" for variables 
    set_props(obj, s); % if obj has handle, no need to return it from set_props() 
end 
相关问题