Skip to content

Commit 6451047

Browse files
bitkeeperoroulet
authored andcommitted
[XmlExporter] possibility to provide an order for extension object members
1 parent 71c8c61 commit 6451047

1 file changed

Lines changed: 24 additions & 2 deletions

File tree

opcua/common/xmlexporter.py

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,17 @@
1414

1515
class XmlExporter(object):
1616

17+
''' If it is required that for _extobj_to_etree members to the value should be written in a certain
18+
order it can be added to the dictionary below.
19+
'''
20+
extobj_ordered_elements = {
21+
ua.NodeId(ua.ObjectIds.Argument) : ['Name',
22+
'DataType',
23+
'ValueRank',
24+
'ArrayDimensions',
25+
'Description']
26+
}
27+
1728
def __init__(self, server):
1829
self.logger = logging.getLogger(__name__)
1930
self.server = server
@@ -407,9 +418,20 @@ def _extobj_to_etree(self, val_el, name, dtype, val):
407418
id_el.text = dtype.to_string()
408419
body_el = Et.SubElement(obj_el, "uax:Body")
409420
struct_el = Et.SubElement(body_el, "uax:" + name)
410-
for name, vtype in val.ua_types.items():
411-
self.member_to_etree(struct_el, name, ua.NodeId(getattr(ua.ObjectIds, vtype)), getattr(val, name))
421+
for name in self._get_member_order(dtype, val):
422+
self.member_to_etree(struct_el, name, ua.NodeId(getattr(ua.ObjectIds, val.ua_types[name])), getattr(val, name))
423+
424+
def _get_member_order(self, dtype, val):
425+
'''
426+
If an dtype has an entry in XmlExporter.extobj_ordered_elements return the export order of the elements
427+
else return the unordered members.
428+
'''
429+
if dtype not in XmlExporter.extobj_ordered_elements.keys():
430+
return val.ua_types.keys()
431+
else:
432+
member_keys = [name for name in XmlExporter.extobj_ordered_elements[dtype] if name in val.ua_types.keys() and getattr(val, name) is not None ]
412433

434+
return member_keys
413435

414436
def indent(self, elem, level=0):
415437
"""

0 commit comments

Comments
 (0)