Вы можете использовать XSLT-преобразование, которое преобразует XML в файл SQL с операторами вставки.
Я сделал это однажды как подтверждение концепции за день или около того.
Вот что я сделал:
<xsl:strip-space elements="*"/>
<xsl:template match="auditlog">
<xsl:if test="sequence/struct/wstring[@value='edr']/../union/string/@value">
INSERT INTO AUDITLOGS (FILENAME, EVENTTIME, EDR) VALUES(
'<xsl:value-of select="@filename"/>',
'<xsl:value-of select="sequence/struct/union/any/sequence/struct/struct[@name='m_eventTime']/@datetime"/>',
'<xsl:value-of select="sequence/struct/wstring[@value='edr']/../union/string/@value"/>'
);
<xsl:apply-templates select="sequence"/>
</xsl:if>
</xsl:template>
<xsl:template match="struct[@id='ModifiedBalance']">
INSERT INTO MODIFIEDBALANCE (SOURCEKIND, SOURCEID, TYPEID, NAMEID, ORIGINAL, CURRENT, LOGID)
SELECT
'<xsl:value-of select="struct/enum/@value"/>',
<xsl:value-of select="struct/longlong/@value"/>,
<xsl:value-of select="struct/ushort[@id='BalanceTypeId']/@value"/>,
<xsl:value-of select="struct/ushort[@id='BalanceNameId']/@value"/>,
<xsl:value-of select="struct[@name='m_original']/@amount"/>,
<xsl:value-of select="struct[@name='m_current']/@amount"/>,
LOGID
FROM AUDITLOGS
WHERE FILENAME = '<xsl:value-of select="../../../../../@filename"/>';
</xsl:template>
</xsl:stylesheet>