Partial success. By removing the 'log4j:' namespace prefix, I was able to configure the XML parser thus:
<event logger="%c" level="%p" timestamp="%d{Elapsed}" thread="%t">
<message>%m</message>
<throwable>
<![CDATA[%S{Exception}]]>
</throwable>
<properties>
<data name="log4japp" value="%S{App}"/>
<data name="log4jmachinename" value="%S{Host}"/>
</properties>
</event>
However, this configuration does not show any of my events. Here's one (albeit without the exception field)
<log4j:event logger="CommunicationsService.CommsService" level="DEBUG" timestamp="1652286872412" thread="28">
<log4j:message>Service 'CommunicationsServer-3733447a' stopped</log4j:message>
<log4j:properties>
<log4j:data name="log4japp" value="Communications Service.exe(20776)" />
<log4j:data name="log4jmachinename" value="RDX-L0122" />
</log4j:properties>
</log4j:event>
Switching to the built-in Log4XmlParser does work, but doesn't show the extra fields I'm after.