我有一个大的xml文件,如下所示:
20120124 07:30:15.301, saving to queue
<logmessage>
<logline1>some data</logline1>
<logline2>some data too</logline2>
</logmessage>
20120124 07:30:15.302, processing message
<logmessage>
<logline1>some data</logline1>
<logline2>some data too</logline2>
</logmessage>
我想将其拆分为多个文件,每个文件包含一个logmessage,我不想在根节点之外保留任何数据。我怎么能这样做?
答案 0 :(得分:0)
小心你的意愿。考虑一下你正在做的事情的后果。如果这是一个非常大的XML文件,如您所述,这将在您的目录中创建大量的小文件。这在很多方面都可能很糟糕。每个将占用至少最小的块大小,这在当今的大型文件系统上可能很大。每个都将在linux上获取一个有限资源的inode,使用df -i来确定你是否有足够的可用资源。最后,如果在同一目录中创建了太多文件,则某些文件系统会有限制或开始执行不佳。
以下内容将告诉您将创建多少个文件:
perl -e '$/="</logmessage>";while(<>) {$i++};print $i,"\n"' log.xml
以下将使用扩展名为.xml的文件名的日期和时间创建一个新文件。如果多条消息具有相同的时间戳,则会附加它们。
perl -e '$/="</logmessage>";while(<>) {m{([\d:\. ]+)};open(fh,">>","$1.xml");s{^.*?(?=<logmessage>)}{}sm;print fh $_,"\n";close fh}' log.xml
还要注意许多XML库会尝试在内存中打开完整文件,这对于非常大的xml文件来说可能是一个问题。此过程不会尝试在内存中打开整个文件。如果您的文件太大而无法容纳在内存中,则不接受任何使用非SAX或流式传输的XML解析器的解决方案。使用DOM解析器将需要的内存等于文档大小乘以开销的倍数。
答案 1 :(得分:0)
如果这样做,您希望使用基于SAX的解析器。 http://en.wikipedia.org/wiki/Simple_API_for_XML试图将其加载到DOM中并从中分割信息将是徒劳的。
答案 2 :(得分:0)
请求帮助处理“大型”XML文件就像是说你想要帮助设计一座跨越“宽阔”河流的桥梁。当我问人们“有多大?”时,我的答案范围从10Mb到100Gb。它有所作为。
您的问题中不清楚的另一件事是我们是否正在处理格式良好的XML。你说它是XML,但你也提到了无效数据。处理格式良好的XML的解决方案可能与处理非XML的数据非常不同。