Check if object's property is empty

I have an xmlcomp.Edits object that was created when performing a comparison via the command
root = slxmlcomp.compare(...)
In this case, an xmlcomp.Edits object was created (see attached file) but all properties are empty. However, I don't know how to check if the properties are empty so I can catch the error that occurs when I try to access the properties. Is there a command to use when the object's properties are empty?

14 Comments

Maybe numel works as expected?
>> numel(root)
ans =
1
I'm not sure how this helps in determining whether or not LeftFileName exists.
What does this show
p = properties(xmlcomp)
if isfield(xmlcomp, 'Edits') && isempty(xmlcomp.Edits)
% Structure has the field but it's empty so do sommething with that knowledge.
end
r = load("root").root
r =
Edits with no properties.
isfield(r, "LeftFileName")
ans = logical
0
BTW, I think you still can catch the error when trying to access the property:
try; r.Version; catch; fprintf('oops! empty!\n'); end
oops! empty!
Even when not empty, isfield returns 0, so it doesn't look like it's the right function to use.
Also, I realize I can catch the error, but I want to have an if statement to prevent the error, like below. I just can't figure out what function I can use to check that the property exists.
try
if SOME_FUNCTION(root, 'LeftFileName')
% do something else because the data is missing
else
% proceed with getting the value
model_left = root.LeftFileName;
end
catch ME
% handle errors
end
See: isprop - True if property exists
As the original question shows, isprop returns 1 when the property does not exist. Trying to access the property gives an error.
Sorry for the noise.
If you don't find anything, you could also put the if in catch block. That's what I do sometimes as well. (e.g. to catch a memory error, which isn't really possible to catch in advance)
Easiest way that comes to my mind is struct itself:
r = load("root.mat").root;
r2 = load("root2.mat").root2;
warning off MATLAB:structOnObject
checkr = struct(r)
checkr = struct with fields:
BaseEdits: []
checkr2 = struct(r2)
checkr2 = struct with fields:
Filters: [1×3 struct] LeftFileName: 'C:\Users\bialym2\PhD\model1.slx' LeftRoot: [1×1 xmlcomp.Node] RightFileName: 'C:\Users\bialym2\PhD\model2.slx' RightRoot: [1×1 xmlcomp.Node] TimeSaved: '20-Feb-2022 18:26:07' Version: '2.0' BaseEdits: [1×1 xmlcomp.internal.edits.Edits]
warning off MATLAB:structOnObject
I'm confused. Could it be that 'TimeSaved' exists in root.mat and rootOP.mat, but isn't shown. I would ask @MathWorks Support Team. Anyhow, there is no property named 'missing'.
%% R2018b
OP = load("rootOP.mat");
r1 = load("root.mat");
r2 = load("root2.mat");
%%
isprop( r1.root, 'TimeSaved' )
ans = logical
1
isprop( r2.root2, 'TimeSaved' )
ans = logical
1
isprop( OP.root, 'TimeSaved' )
ans = logical
1
isprop( OP.root, 'missing' )
ans = logical
0
if you want a function for your check, you could implement it for your needs like this:
function ispropOut = SOME_FUNCTION(objIn,nameIn)
ispropOut = false(size(objIn));
for nObjRow = 1:size(objIn,1)
for nObjCol = 1:size(objIn,2)
try
objIn(nObjRow,nObjCol).(nameIn);
ispropOut(nObjRow,nObjCol) = true;
catch
end
end
end
end

Sign in to comment.

Answers (1)

Might this help?
>> EmptyRoot=xmlcomp.Edits('')
EmptyRoot =
Edits with no properties.
>> isequal(root,EmptyRoot)
ans =
logical
1
>> isequal(root2,EmptyRoot)
ans =
logical
0

Categories

Products

Release

R2021b

Asked:

on 20 Feb 2022

Answered:

on 23 Mar 2022

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!