armodel 1.7.3__py3-none-any.whl → 1.7.5__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- armodel/cli/file_list_cli.py +70 -0
- armodel/models/M2/AUTOSARTemplates/BswModuleTemplate/BswBehavior.py +2 -1
- armodel/models/M2/AUTOSARTemplates/CommonStructure/InternalBehavior.py +1 -1
- armodel/models/M2/AUTOSARTemplates/CommonStructure/ServiceNeeds.py +6 -7
- armodel/models/M2/AUTOSARTemplates/DiagnosticExtract/DiagnosticContribution.py +47 -0
- armodel/models/M2/AUTOSARTemplates/DiagnosticExtract/__init__.py +0 -0
- armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/ARPackage.py +73 -3
- armodel/models/M2/AUTOSARTemplates/GenericStructure/GeneralTemplateClasses/PrimitiveTypes.py +37 -1
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/Communication.py +17 -1
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/AutosarVariableRef.py +31 -0
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/DataElements.py +4 -3
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/InstanceRefsUsage.py +17 -32
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/RTEEvents.py +4 -0
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/ServiceMapping.py +7 -1
- armodel/models/M2/AUTOSARTemplates/SWComponentTemplate/SwcInternalBehavior/__init__.py +47 -15
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/DiagnosticConnection.py +58 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Ethernet/EthernetCommunication.py +244 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Ethernet/EthernetTopology.py +281 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Ethernet/NetworkEndpoint.py +328 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Ethernet/ServiceInstances.py +522 -11
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Lin/LinCommunication.py +114 -6
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/Fibex4Lin/LinTopology.py +94 -0
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/CoreCommunication.py +151 -6
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/CoreTopology.py +140 -12
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/EcuInstance.py +31 -6
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/Fibex/FibexCore/Timing.py +7 -12
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/NetworkManagement.py +135 -13
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/TransportProtocols.py +25 -1
- armodel/models/M2/AUTOSARTemplates/SystemTemplate/__init__.py +4 -3
- armodel/models/M2/MSR/AsamHdo/BaseTypes.py +0 -1
- armodel/models/M2/MSR/DataDictionary/RecordLayout.py +1 -1
- armodel/models/__init__.py +6 -0
- armodel/parser/abstract_arxml_parser.py +2 -0
- armodel/parser/arxml_parser.py +561 -62
- armodel/tests/test_armodel/models/test_ar_ref.py +2 -2
- armodel/writer/abstract_arxml_writer.py +1 -3
- armodel/writer/arxml_writer.py +702 -223
- {armodel-1.7.3.dist-info → armodel-1.7.5.dist-info}/METADATA +47 -2
- {armodel-1.7.3.dist-info → armodel-1.7.5.dist-info}/RECORD +43 -34
- {armodel-1.7.3.dist-info → armodel-1.7.5.dist-info}/entry_points.txt +1 -0
- {armodel-1.7.3.dist-info → armodel-1.7.5.dist-info}/LICENSE +0 -0
- {armodel-1.7.3.dist-info → armodel-1.7.5.dist-info}/WHEEL +0 -0
- {armodel-1.7.3.dist-info → armodel-1.7.5.dist-info}/top_level.txt +0 -0
|
@@ -3,7 +3,7 @@ from typing import List
|
|
|
3
3
|
from ....M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Can.CanCommunication import RxIdentifierRange
|
|
4
4
|
from ....M2.AUTOSARTemplates.SystemTemplate.Fibex.FibexCore.CoreCommunication import FibexElement
|
|
5
5
|
from ....M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ArObject import ARObject
|
|
6
|
-
from ....M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import ARLiteral, ARNumerical, RefType, ARBoolean
|
|
6
|
+
from ....M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.PrimitiveTypes import ARLiteral, ARNumerical, Integer, PositiveInteger, RefType, ARBoolean, TimeValue
|
|
7
7
|
from ....M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.Identifiable import Identifiable
|
|
8
8
|
|
|
9
9
|
class NmClusterCoupling(ARObject, metaclass = ABCMeta):
|
|
@@ -210,7 +210,7 @@ class NmCluster(Identifiable, metaclass=ABCMeta):
|
|
|
210
210
|
self.communicationClusterRef = None
|
|
211
211
|
self.nmChannelId = None
|
|
212
212
|
self.nmChannelSleepMaster = None
|
|
213
|
-
self.
|
|
213
|
+
self.nmNodes = [] # type: List[NmNode]
|
|
214
214
|
self.nmNodeDetectionEnabled = None
|
|
215
215
|
self.nmNodeIdEnabled = None
|
|
216
216
|
self.nmPncParticipation = None
|
|
@@ -240,14 +240,24 @@ class NmCluster(Identifiable, metaclass=ABCMeta):
|
|
|
240
240
|
|
|
241
241
|
def createCanNmNode(self, short_name: str) -> CanNmNode:
|
|
242
242
|
if (short_name not in self.elements):
|
|
243
|
-
|
|
244
|
-
self.
|
|
245
|
-
self.
|
|
246
|
-
return self.
|
|
243
|
+
node = CanNmNode(self, short_name)
|
|
244
|
+
self.addElement(node)
|
|
245
|
+
self.nmNodes.append(node)
|
|
246
|
+
return self.getElement(short_name)
|
|
247
|
+
|
|
248
|
+
def readUdpNmNode(self, short_name: str) -> UdpNmNode:
|
|
249
|
+
if (short_name not in self.elements):
|
|
250
|
+
node = UdpNmNode(self, short_name)
|
|
251
|
+
self.addElement(node)
|
|
252
|
+
self.nmNodes.append(node)
|
|
253
|
+
return self.getElement(short_name)
|
|
247
254
|
|
|
248
255
|
def getCanNmNodes(self) -> List[CanNmNode]:
|
|
249
256
|
return list(sorted(filter(lambda a: isinstance(a, CanNmNode), self.elements.values()), key= lambda o:o.short_name))
|
|
250
257
|
|
|
258
|
+
def getUdpNmNodes(self) -> List[UdpNmNode]:
|
|
259
|
+
return list(sorted(filter(lambda a: isinstance(a, UdpNmNode), self.elements.values()), key= lambda o:o.short_name))
|
|
260
|
+
|
|
251
261
|
def getNmNodes(self) -> List[NmNode]:
|
|
252
262
|
return list(sorted(filter(lambda a: isinstance(a, NmNode), self.elements.values()), key= lambda o:o.short_name))
|
|
253
263
|
|
|
@@ -514,10 +524,7 @@ class NmEcu(Identifiable):
|
|
|
514
524
|
|
|
515
525
|
def setNmUserDataEnabled(self, value):
|
|
516
526
|
self.nmUserDataEnabled = value
|
|
517
|
-
return self
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
527
|
+
return self
|
|
521
528
|
|
|
522
529
|
class NmConfig(FibexElement):
|
|
523
530
|
def __init__(self, parent: ARObject, short_name: str):
|
|
@@ -529,12 +536,21 @@ class NmConfig(FibexElement):
|
|
|
529
536
|
def createCanNmCluster(self, short_name: str) -> CanNmCluster:
|
|
530
537
|
if (short_name not in self.elements):
|
|
531
538
|
cluster = CanNmCluster(self, short_name)
|
|
532
|
-
self.
|
|
533
|
-
return self.
|
|
539
|
+
self.addElement(cluster)
|
|
540
|
+
return self.getElement(short_name)
|
|
534
541
|
|
|
542
|
+
def createUdpNmCluster(self, short_name: str) -> UdpNmCluster:
|
|
543
|
+
if (short_name not in self.elements):
|
|
544
|
+
cluster = UdpNmCluster(self, short_name)
|
|
545
|
+
self.addElement(cluster)
|
|
546
|
+
return self.getElement(short_name)
|
|
547
|
+
|
|
535
548
|
def getCanNmClusters(self) -> List[CanNmCluster]:
|
|
536
549
|
return list(sorted(filter(lambda a: isinstance(a, CanNmCluster), self.elements.values()), key= lambda o:o.short_name))
|
|
537
550
|
|
|
551
|
+
def getUdpNmClusters(self) -> List[UdpNmCluster]:
|
|
552
|
+
return list(sorted(filter(lambda a: isinstance(a, UdpNmCluster), self.elements.values()), key= lambda o:o.short_name))
|
|
553
|
+
|
|
538
554
|
def getNmClusters(self) -> List[NmCluster]:
|
|
539
555
|
return list(sorted(filter(lambda a: isinstance(a, NmCluster), self.elements.values()), key= lambda o:o.short_name))
|
|
540
556
|
|
|
@@ -550,4 +566,110 @@ class NmConfig(FibexElement):
|
|
|
550
566
|
|
|
551
567
|
def addNmIfEcus(self, value):
|
|
552
568
|
self.nmIfEcus.append(value)
|
|
553
|
-
return self
|
|
569
|
+
return self
|
|
570
|
+
|
|
571
|
+
class UdpNmCluster(NmCluster):
|
|
572
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
573
|
+
super().__init__(parent, short_name)
|
|
574
|
+
|
|
575
|
+
self.nmCbvPosition = None # type: Integer
|
|
576
|
+
self.nmImmediateNmCycleTime = None # type: TimeValue
|
|
577
|
+
self.nmImmediateNmTransmissions = None # type: PositiveInteger
|
|
578
|
+
self.nmMessageTimeoutTime = None # type: TimeValue
|
|
579
|
+
self.nmMsgCycleTime = None # type: TimeValue
|
|
580
|
+
self.nmNetworkTimeout = None # type: TimeValue
|
|
581
|
+
self.nmNidPosition = None # type: Integer
|
|
582
|
+
self.nmRemoteSleepIndicationTime = None # type: TimeValue
|
|
583
|
+
self.nmRepeatMessageTime = None # type: TimeValue
|
|
584
|
+
self.nmWaitBusSleepTime = None # type: TimeValue
|
|
585
|
+
self.vlanRef = None # type: RefType
|
|
586
|
+
|
|
587
|
+
def getNmCbvPosition(self):
|
|
588
|
+
return self.nmCbvPosition
|
|
589
|
+
|
|
590
|
+
def setNmCbvPosition(self, value):
|
|
591
|
+
if value is not None:
|
|
592
|
+
self.nmCbvPosition = value
|
|
593
|
+
return self
|
|
594
|
+
|
|
595
|
+
def getNmImmediateNmCycleTime(self):
|
|
596
|
+
return self.nmImmediateNmCycleTime
|
|
597
|
+
|
|
598
|
+
def setNmImmediateNmCycleTime(self, value):
|
|
599
|
+
if value is not None:
|
|
600
|
+
self.nmImmediateNmCycleTime = value
|
|
601
|
+
return self
|
|
602
|
+
|
|
603
|
+
def getNmImmediateNmTransmissions(self):
|
|
604
|
+
return self.nmImmediateNmTransmissions
|
|
605
|
+
|
|
606
|
+
def setNmImmediateNmTransmissions(self, value):
|
|
607
|
+
if value is not None:
|
|
608
|
+
self.nmImmediateNmTransmissions = value
|
|
609
|
+
return self
|
|
610
|
+
|
|
611
|
+
def getNmMessageTimeoutTime(self):
|
|
612
|
+
return self.nmMessageTimeoutTime
|
|
613
|
+
|
|
614
|
+
def setNmMessageTimeoutTime(self, value):
|
|
615
|
+
if value is not None:
|
|
616
|
+
self.nmMessageTimeoutTime = value
|
|
617
|
+
return self
|
|
618
|
+
|
|
619
|
+
def getNmMsgCycleTime(self):
|
|
620
|
+
return self.nmMsgCycleTime
|
|
621
|
+
|
|
622
|
+
def setNmMsgCycleTime(self, value):
|
|
623
|
+
if value is not None:
|
|
624
|
+
self.nmMsgCycleTime = value
|
|
625
|
+
return self
|
|
626
|
+
|
|
627
|
+
def getNmNetworkTimeout(self):
|
|
628
|
+
return self.nmNetworkTimeout
|
|
629
|
+
|
|
630
|
+
def setNmNetworkTimeout(self, value):
|
|
631
|
+
if value is not None:
|
|
632
|
+
self.nmNetworkTimeout = value
|
|
633
|
+
return self
|
|
634
|
+
|
|
635
|
+
def getNmNidPosition(self):
|
|
636
|
+
return self.nmNidPosition
|
|
637
|
+
|
|
638
|
+
def setNmNidPosition(self, value):
|
|
639
|
+
if value is not None:
|
|
640
|
+
self.nmNidPosition = value
|
|
641
|
+
return self
|
|
642
|
+
|
|
643
|
+
def getNmRemoteSleepIndicationTime(self):
|
|
644
|
+
return self.nmRemoteSleepIndicationTime
|
|
645
|
+
|
|
646
|
+
def setNmRemoteSleepIndicationTime(self, value):
|
|
647
|
+
if value is not None:
|
|
648
|
+
self.nmRemoteSleepIndicationTime = value
|
|
649
|
+
return self
|
|
650
|
+
|
|
651
|
+
def getNmRepeatMessageTime(self):
|
|
652
|
+
return self.nmRepeatMessageTime
|
|
653
|
+
|
|
654
|
+
def setNmRepeatMessageTime(self, value):
|
|
655
|
+
if value is not None:
|
|
656
|
+
self.nmRepeatMessageTime = value
|
|
657
|
+
return self
|
|
658
|
+
|
|
659
|
+
def getNmWaitBusSleepTime(self):
|
|
660
|
+
return self.nmWaitBusSleepTime
|
|
661
|
+
|
|
662
|
+
def setNmWaitBusSleepTime(self, value):
|
|
663
|
+
if value is not None:
|
|
664
|
+
self.nmWaitBusSleepTime = value
|
|
665
|
+
return self
|
|
666
|
+
|
|
667
|
+
def getVlanRef(self):
|
|
668
|
+
return self.vlanRef
|
|
669
|
+
|
|
670
|
+
def setVlanRef(self, value):
|
|
671
|
+
if value is not None:
|
|
672
|
+
self.vlanRef = value
|
|
673
|
+
return self
|
|
674
|
+
|
|
675
|
+
|
|
@@ -1,6 +1,30 @@
|
|
|
1
|
+
from typing import List
|
|
1
2
|
from ....M2.AUTOSARTemplates.SystemTemplate.Fibex.FibexCore.CoreCommunication import FibexElement
|
|
2
3
|
from ....M2.AUTOSARTemplates.GenericStructure.GeneralTemplateClasses.ArObject import ARObject
|
|
3
4
|
|
|
4
5
|
class CanTpConfig(FibexElement):
|
|
5
6
|
def __init__(self, parent: ARObject, short_name: str):
|
|
6
|
-
super().__init__(parent, short_name)
|
|
7
|
+
super().__init__(parent, short_name)
|
|
8
|
+
|
|
9
|
+
class DoIpTpConfig(FibexElement):
|
|
10
|
+
def __init__(self, parent: ARObject, short_name: str):
|
|
11
|
+
super().__init__(parent, short_name)
|
|
12
|
+
|
|
13
|
+
self.doIpLogicAddresses = [] # type: List[DoIpLogicAddress]
|
|
14
|
+
self.tpConnections = [] # typeL List[DoIpTpConnection]
|
|
15
|
+
|
|
16
|
+
def getDoIpLogicAddresses(self):
|
|
17
|
+
return self.doIpLogicAddresses
|
|
18
|
+
|
|
19
|
+
def addDoIpLogicAddress(self, value):
|
|
20
|
+
if value is not None:
|
|
21
|
+
self.doIpLogicAddresses.append(value)
|
|
22
|
+
return self
|
|
23
|
+
|
|
24
|
+
def getTpConnections(self):
|
|
25
|
+
return self.tpConnections
|
|
26
|
+
|
|
27
|
+
def addTpConnection(self, value):
|
|
28
|
+
if value is not None:
|
|
29
|
+
self.tpConnections.append(value)
|
|
30
|
+
return self
|
|
@@ -277,7 +277,7 @@ class System(ARElement):
|
|
|
277
277
|
self.clientIdDefinitionSetRefs = [] # type: List[RefType]
|
|
278
278
|
self.containerIPduHeaderByteOrder = None
|
|
279
279
|
self.ecuExtractVersion = None
|
|
280
|
-
self.fibexElements = []
|
|
280
|
+
self.fibexElements = [] # type: List[RefType]
|
|
281
281
|
self.interpolationRoutineMappingSetRefs = [] # type: List[RefType]
|
|
282
282
|
self.j1939SharedAddressClusters = []
|
|
283
283
|
self.mappings = [] # type: List[SystemMapping]
|
|
@@ -310,10 +310,11 @@ class System(ARElement):
|
|
|
310
310
|
return self
|
|
311
311
|
|
|
312
312
|
def getFibexElementRefs(self):
|
|
313
|
-
return self.fibexElements
|
|
313
|
+
return sorted(self.fibexElements, key= lambda i: i.getShortValue())
|
|
314
314
|
|
|
315
315
|
def addFibexElementRef(self, value):
|
|
316
|
-
|
|
316
|
+
if value is not None:
|
|
317
|
+
self.fibexElements.append(value)
|
|
317
318
|
return self
|
|
318
319
|
|
|
319
320
|
def getInterpolationRoutineMappingSetRefs(self):
|
|
@@ -114,7 +114,7 @@ class SwRecordLayoutGroup(ARObject):
|
|
|
114
114
|
self.shortLabel = None # type: ARLiteral
|
|
115
115
|
self.swGenericAxisParamTypeRef = None # type: RefType
|
|
116
116
|
self.swRecordLayoutComponent = None # type: ARLiteral
|
|
117
|
-
self.swRecordLayoutGroupAxis = None # type:
|
|
117
|
+
self.swRecordLayoutGroupAxis = None # type: AxisIndexType
|
|
118
118
|
self.swRecordLayoutGroupContentType = None # type: SwRecordLayoutGroupContent
|
|
119
119
|
self.swRecordLayoutGroupFrom = None # type: ARLiteral
|
|
120
120
|
self.swRecordLayoutGroupIndex = None # type: ARLiteral
|
armodel/models/__init__.py
CHANGED
|
@@ -34,6 +34,7 @@ from .M2.AUTOSARTemplates.CommonStructure.ResourceConsumption.MemorySectionUsage
|
|
|
34
34
|
from .M2.AUTOSARTemplates.CommonStructure.ServiceNeeds import *
|
|
35
35
|
from .M2.AUTOSARTemplates.CommonStructure.SwcBswMapping import *
|
|
36
36
|
from .M2.AUTOSARTemplates.CommonStructure.TriggerDeclaration import *
|
|
37
|
+
from .M2.AUTOSARTemplates.DiagnosticExtract.DiagnosticContribution import *
|
|
37
38
|
from .M2.AUTOSARTemplates.SWComponentTemplate import *
|
|
38
39
|
from .M2.AUTOSARTemplates.SWComponentTemplate.Communication import *
|
|
39
40
|
from .M2.AUTOSARTemplates.SWComponentTemplate.Components import *
|
|
@@ -52,6 +53,7 @@ from .M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.ServerCall imp
|
|
|
52
53
|
from .M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.ServiceMapping import *
|
|
53
54
|
from .M2.AUTOSARTemplates.SWComponentTemplate.SwcInternalBehavior.Trigger import *
|
|
54
55
|
from .M2.AUTOSARTemplates.SystemTemplate.DataMapping import *
|
|
56
|
+
from .M2.AUTOSARTemplates.SystemTemplate.DiagnosticConnection import *
|
|
55
57
|
from .M2.AUTOSARTemplates.SystemTemplate.InstanceRefs import *
|
|
56
58
|
from .M2.AUTOSARTemplates.SystemTemplate.NetworkManagement import *
|
|
57
59
|
from .M2.AUTOSARTemplates.SystemTemplate.TransportProtocols import *
|
|
@@ -59,7 +61,11 @@ from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Multiplatform import *
|
|
|
59
61
|
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Can.CanCommunication import *
|
|
60
62
|
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Can.CanTopology import *
|
|
61
63
|
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Lin.LinCommunication import *
|
|
64
|
+
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Lin.LinTopology import *
|
|
62
65
|
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Ethernet.EthernetFrame import *
|
|
66
|
+
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Ethernet.EthernetTopology import *
|
|
67
|
+
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Ethernet.NetworkEndpoint import *
|
|
68
|
+
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Ethernet.EthernetCommunication import *
|
|
63
69
|
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.Fibex4Ethernet.ServiceInstances import *
|
|
64
70
|
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.FibexCore.CoreCommunication import *
|
|
65
71
|
from .M2.AUTOSARTemplates.SystemTemplate.Fibex.FibexCore.CoreTopology import *
|
|
@@ -154,12 +154,14 @@ class AbstractARXMLParser:
|
|
|
154
154
|
time_value.setValue(child_element.text)
|
|
155
155
|
return time_value
|
|
156
156
|
|
|
157
|
+
'''
|
|
157
158
|
def getChildElementBooleanValue(self, short_name: str, element: ET.Element, key: str) -> Boolean:
|
|
158
159
|
literal = self.getChildElementLiteral(short_name, element, key)
|
|
159
160
|
bool_value = Boolean()
|
|
160
161
|
bool_value.timestamp = literal.timestamp
|
|
161
162
|
bool_value.value = self._convertStringToBooleanValue(literal._value)
|
|
162
163
|
return bool_value
|
|
164
|
+
'''
|
|
163
165
|
|
|
164
166
|
def getChildElementOptionalBooleanValue(self, element: ET.Element, key: str) -> Boolean:
|
|
165
167
|
literal = self.getChildElementOptionalLiteral(element, key)
|