|
14 | 14 |
|
15 | 15 | class XmlExporter(object): |
16 | 16 |
|
| 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 | + |
17 | 28 | def __init__(self, server): |
18 | 29 | self.logger = logging.getLogger(__name__) |
19 | 30 | self.server = server |
@@ -407,9 +418,20 @@ def _extobj_to_etree(self, val_el, name, dtype, val): |
407 | 418 | id_el.text = dtype.to_string() |
408 | 419 | body_el = Et.SubElement(obj_el, "uax:Body") |
409 | 420 | 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 ] |
412 | 433 |
|
| 434 | + return member_keys |
413 | 435 |
|
414 | 436 | def indent(self, elem, level=0): |
415 | 437 | """ |
|
0 commit comments