Вот сценарий с низким объемом занимаемой памяти, чтобы сделать это в бесплатном XML-редакторе firstobject (foxe) в режиме файла CMarkup. Я не уверен, что вы подразумеваете под отсутствием взаимозависимых верхних узлов или проверкой тегов, но при условии, что под корневым элементом у вас есть миллионы элементов верхнего уровня, содержащих свойства объекта или строки, каждый из которых необходимо объединить в единое целое, и вы хотели 1 миллион на выходной файл, вы можете сделать это:
split_xml_15GB()
{
int nObjectCount = 0, nFileCount = 0;
CMarkup xmlInput, xmlOutput;
xmlInput.Open( "15GB.xml", MDF_READFILE );
xmlInput.FindElem(); // root
str sRootTag = xmlInput.GetTagName();
xmlInput.IntoElem();
while ( xmlInput.FindElem() )
{
if ( nObjectCount == 0 )
{
++nFileCount;
xmlOutput.Open( "piece" + nFileCount + ".xml", MDF_WRITEFILE );
xmlOutput.AddElem( sRootTag );
xmlOutput.IntoElem();
}
xmlOutput.AddSubDoc( xmlInput.GetSubDoc() );
++nObjectCount;
if ( nObjectCount == 1000000 )
{
xmlOutput.Close();
nObjectCount = 0;
}
}
if ( nObjectCount )
xmlOutput.Close();
xmlInput.Close();
return nFileCount;
}
Я разместил видео на YouTube и статью об этом здесь:
http://www.firstobject.com/xml-splitter-script-video.htm