在处理大型 XML 文件时,我无法使用 XSLT 将 XML 展平和转换为 CSV 文件。
目前,我正在lxml使用 XSL 文件解析嵌套的 XML 文件来展平输出,然后将输出写入 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>
这对小文件很有用,但现在我想对 +- 2.5gb 的 XML 文件做同样的事情。使用 etree.parse 会将其加载到内存中,这显然不适用于较大的文件。
我想在某个地方迭代,所以我没有将 XML 文件加载到内存中并逐行写入 CSV 行,同时仍然使用 XSLT 进行转换。我正在使用 XSLT 文件,因为这是我知道(现在)如何展平嵌套的 XML 文件的唯一方法。
至尊宝的传说
holdtom
守着星空守着你
相关分类