首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将大型XML文件由某个节点拆分为较小的文件。

将大型XML文件由某个节点拆分为较小的文件。
EN

Ask Ubuntu用户
提问于 2012-06-06 19:32:52
回答 1查看 2.3K关注 0票数 0

我有一个1GB的XML文件(大约6000000行)。目标是将该文件拆分为较小的.xml文件,每个文件的行数大约为20000行。

代码语言:javascript
复制
<?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>

对于类似的情况,我使用了splitgrep,但对于这个特殊情况,它变得更加棘手:

1)

拆分过程必须在特定的节点名称(例如,</file> )下进行,以保持文件的完整性。

2)

目标文件必须包含headerfooter,才能使该文件有效且可读。

报头

代码语言:javascript
复制
<?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">

页脚

代码语言:javascript
复制
  </files.index>
</ICECAT-interface>

3)

最后,我对这个问题缺乏解决方案是因为这个“操作”将在预定的cron上不时地重复。

注意:目标文件可以有任何名称,该目录假设脚本运行的位置相同。

EN

回答 1

Ask Ubuntu用户

发布于 2012-06-06 22:54:34

一种解决方案是使用支持流的Saxon。例如

代码语言:javascript
复制
<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>
票数 0
EN
页面原文内容由Ask Ubuntu提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://askubuntu.com/questions/147438

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档