Я не могу сгладить и преобразовать файл XML в CSV с помощью XSLT при работе с большими файлами XML.
В настоящее время я анализирую вложенный файл XML с помощью lxml
, используя файл XSLчтобы сгладить вывод, а затем я записываю вывод в файл CSV.
Мой XML выглядит примерно так:
<root>
<level1>
<level2>
<topid>1</topid>
<level3>
<subtopid>1</topid>
<level4>
<subid>1</id>
<descr>test</descr>
</level4>
<level4>
<subid>2</id>
<descr>test2</descr>
</level4>
...
</level3>
...
</level2>
</level1>
</root>
Я хочу получить следующий файл CSV:
topid,subtopid,subid,descr
1,1,1,test
1,1,2,test2
....
Мой XSLT:
<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="utf-8" use-character-maps="map"/>
<xsl:character-map name="map">
<xsl:output-character character="," string=" "/>
</xsl:character-map>
<xsl:strip-space elements="*"/>
<xsl:variable name="delimiter" select="','"/>
<xsl:variable name="newline" select="'
'" />
<xsl:template match="/root">
<xsl:text>topid,subtopid,subid,descr</xsl:text>
<xsl:value-of select="$newline" />
<xsl:for-each select="level1/level2/level3/level4">
<xsl:value-of select="ancestor::root/level1/level2/topid" />
<xsl:value-of select="$delimiter" />
<xsl:value-of select="ancestor::root/level1/level2/level3/subtopid" />
<xsl:value-of select="$delimiter" />
<xsl:value-of select="subid" />
<xsl:value-of select="$delimiter" />
<xsl:value-of select="descr" />
<xsl:value-of select="$newline" />
</xsl:for-each>
</xsl:template>
Мой код Python:
import lxml.etree as ET
xsltfile = ET.XSLT(ET.parse('transactions.xsl'))
xmlfile = ET.parse('myxmlfile.xml')
output = xsltfile(xmlfile).write_output('output.csv')
Это прекрасно работает для небольших файлов, но теперь я хочусделать то же самое с XML-файлом + - 2,5 ГБ.Использование etree.parse загрузит его в память, которая, очевидно, не будет работать с большими файлами.
Я хочу где-то выполнить итерацию, поэтому я не загружаю файл XML в память и пишу в строку CSV для строки, все еще используя XSLT для преобразования.Я использую файл XSLT, потому что это единственный способ, которым я знаю (сейчас), как сгладить вложенный файл XML.