我有一个相对较大的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的行。通过限制处理文件的大小,我可以大大缩短处理时间。
我正在寻找解决此问题的最有效方法。手动做一段时间我很好,但我宁愿尽早限制它。
答案 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
个节点的树。
告知您正在使用的语言,我或许可以向您发送一些示例。