我有一个XML
1GB 的文件(大约 6000000 行)。目标是将此文件拆分为较小的.xml
文件,每个文件大约有 20000 行。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ICECAT-interface SYSTEM "http://data.icecat.biz/dtd/files.index.dtd">
<!-- source: Icecat.biz 2012 -->
<ICECAT-interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://data.icecat.biz/xsd/files.index.xsd">
<files.index Generated="20120418012252">
<file path="export/level4/PT/726463.xml" Product_ID="726463" Updated="20110815090811" Quality="ICECAT" Supplier_id="393" Prod_ID="174174" Catid="575" On_Market="0" Model_Name="Caplio R4 6.0MPix Silver" Product_View="4052" HighPic="http://images.icecat.biz/img/norm/high/726463-490.jpg" HighPicSize="102843" HighPicWidth="800" HighPicHeight="600" Date_Added="20070219000000">
<EAN_UPCS>
<EAN_UPC Value="4961311027048" />
</EAN_UPCS>
</file>
...
<file path="export/level4/PT/738860.xml" Product_ID="738860" Updated="20101217151007" Quality="ICECAT" Supplier_id="169" Prod_ID="HEJ423020F9AT0C" Catid="219" On_Market="0" Model_Name="Endurastar J4K30" Product_View="1160" HighPic="http://images.icecat.biz/img/norm/high/738860-3355.jpg" HighPicSize="52197" HighPicWidth="175" HighPicHeight="212" Date_Added="20070219000000"></file>
</files.index>
</ICECAT-interface>
对于类似的情况,我已经使用了split
或grep
,但对于这种特殊情况,它变得更加棘手:
1)
拆分过程必须在特定节点名称下进行,例如, </file>
以保持文件的完整性。
2)
目标文件必须包含header
和footer
,才能使文件有效且可读。
标题
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE ICECAT-interface SYSTEM "http://data.icecat.biz/dtd/files.index.dtd">
<!-- source: Icecat.biz 2012 -->
<ICECAT-interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://data.icecat.biz/xsd/files.index.xsd">
<files.index Generated="20120418012252">
页脚
</files.index>
</ICECAT-interface>
3)
最后,我对这个问题没有解决方案,是因为这个“动作”会按照计划不时重复cron
。
笔记: 目标文件可以有任何名称,目录假设与脚本运行的目录相同。
答案1
一种解决方案是使用支持流式传输功能的 Saxon-EE。例如
<xsl:stylesheet version="3.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:mode streamable="yes" on-no-match="shallow-copy"/>
<xsl:template match="file">
<xsl:result-document href="??????"
doctype-system="http://data.icecat.biz/dtd/files.index.dtd">
<ICECAT-interface xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://data.icecat.biz/xsd/files.index.xsd">
<files.index Generated="20120418012252">
<xsl:copy-of select="."/>
</files.index>
</ICECAT-interface>
</xsl:template>