如何复制部分xml文件

时间:2014-02-12 15:51:14

标签: xml xml-parsing linq-to-xml

我有一个相对较大的xml文件。即使我只需要部分文件,客户端也会向我发送完整的文件。因此,我想解析出我需要的部分并处理这个新文件。

这是xml的一部分

<Activity>
    <RetailFormat>ABC</RetailFormat>
    <FeedDate>2014-02-06 21:01:10</FeedDate>
    <ActivityId>665507</ActivityId>
    <ActivityTitle>ABC 3.9.14 Hawaii </ActivityTitle>
    <StartDate>2014-03-09</StartDate>
    <EndDate>2014-03-15</EndDate>
    <StartTime>00:00:00</StartTime>
    <EndTime>23:59:59</EndTime>
    <JANumber>0</JANumber>
    <PlanItemNo>0</PlanItemNo>
    <ChannelType>Circular</ChannelType>
    <Version>
    </Version>
</Activity>

我有一个需要搜索的ActivityID列表。如果ActivityID在列表中,我想将整个Activity复制到一个新文件中。如果没有,我想转到下一个活动。实际上是从开始标记向下几百行。我没有使用xml,除了手动解析部分。我不知道是否有一种编程方式来处理这个问题。另外,我需要这个文件中的15K行。该文件中有1.3MM的行。通过限制处理文件的大小,我可以大大缩短处理时间。

我正在寻找解决此问题的最有效方法。手动做一段时间我很好,但我宁愿尽早限制它。

1 个答案:

答案 0 :(得分:1)

如果文件非常大并且需要考虑内存,则应使用SAX解析器(使用您选择的语言 - 将其添加到您的标记中)。 SAX不适用于树,因此您必须在解析时自己重建子树。优点是它不必将整个XML加载到内存中。你只存储你真正需要的东西。

SAX解析器是一个基于事件的XML解析器,它将按顺序读取您的文件并生成事件。事件由startElement(...)startDocument(...)endElement(...)characters(...)等方法处理。您必须编写一个处理程序来捕获您希望处理实现这些方法的事件。

您的处理程序必须实现startElement()characters()endElement(),并使用实例变量来保存方法之间需要的相关数据(例如:current-element,数组到存储您的代码片段等。

如果内存不是问题,您可以使用DOM或XSLT。使用DOM,您可以使用getElementsByTagName("Activity")检索<Activity>子树的数组,然后使用该子树上的DOM方法检查<ActivityID>。然后,您可以复制所需的子树,将它们添加到另一个根,或从当前根中删除不需要的子树。

使用XSLT,您可以编写一个XML模板,选择具有XPath表达式的所有<Activity>节点,例如//Activity,检查将//Activity/ActivityID与您的ID列表进行比较并生成结果的ID只包含所需Activity个节点的树。

告知您正在使用的语言,我或许可以向您发送一些示例。