将大型XML文件分割成小块

将大型XML文件分割成小块,xml,vb.net,wikipedia,Xml,Vb.net,Wikipedia,我有一个很大的维基百科转储,我想把它剪切成不同的文件(每篇文章一个文件)。我写了一个VB应用程序来为我做这件事,但它相当慢,经过几个小时的剪辑后就报废了。我目前正在使用另一个应用程序将文件分割成更小的50mb块,但这需要很长时间(每个块20-30分钟)。如果我这样做的话,我应该能够把每一个都切掉 有人对更快地剪切此文件有什么建议吗?我假设您正在使用DOM解析器。对于可能较大的文件,应始终使用解析器。DOM解析器将整个文件读取到内存中,SAX解析器一次读取的内容尽可能少,因此操作效率更高。介绍如何

我有一个很大的维基百科转储,我想把它剪切成不同的文件(每篇文章一个文件)。我写了一个VB应用程序来为我做这件事,但它相当慢,经过几个小时的剪辑后就报废了。我目前正在使用另一个应用程序将文件分割成更小的50mb块,但这需要很长时间(每个块20-30分钟)。如果我这样做的话,我应该能够把每一个都切掉


有人对更快地剪切此文件有什么建议吗?

我假设您正在使用DOM解析器。对于可能较大的文件,应始终使用解析器。DOM解析器将整个文件读取到内存中,SAX解析器一次读取的内容尽可能少,因此操作效率更高。介绍如何编写C#SAX解析器,VB应该非常类似

使用C#最简单的方法是使用XmlReader。您可以单独使用XmlReader以获得最快的实现,也可以与新的LINQ XNode类结合使用,以获得性能和易用性的完美结合。有关示例,请参阅此MSDN文章:


您应该能够修改示例,使其一次只在内存中保存一个文档的节点,然后将其作为文件写回。它应该运行良好,适用于非常大的文件。

您应该试试vtd xml,我们已经有人告诉我们它在拆分大型xml文件方面有多好。。。
我们还被告知,DOM需要永远

如果我在Java中这样做,我会使用和

在某种伪代码中,让我们假设一个
和,但我的专业知识不在.NET中,我无法从文档中判断它们是否与我刚才给您的Java版本的工作方式完全相同

(我在这里的目的更多的是向您展示如何解决这个问题,而不是告诉您需要的类的名称。)

XMLEventReader r = // an XMLEventReader for the original wikipedia dump

XMLEventWriter w = null;

bool isInsideArticle = false;

while (r.hasNext()){
  XMLEvent e = r.nextEvent();

  if (e.isStartElement() &&
        e.asStartElement().getName().getLocalPart().equals("article")){
     w = openNewWriter();
     // write the stuff that belongs outside the <article> tag
     // by synthesizing XMLEvents and using w.add() to add them
     w.add(e);
     isInsideArticle = true;
  } else if (e.isEndElement() &&
           e.asEndElement().getName().getLocalPart().equals("article")) {
     w.add(e);
     // write the stuff that belongs outside the <article> tag
     // by synthesizing XMLEvents and using w.add() to add them
     isInsideArticle = false;
     w.close();
  } else if (isInsideArticle) {
     w.add(e);
  } else {
     // this tag gets dropped on the floor because it's not inside any article
  }
}