Мне нужно перебирать большой XML-файл (~ 2 ГБ) и выборочно копировать определенные узлы в один или несколько отдельных XML-файлов.Iterate Large XML File and Copy Select Nodes
Моя первая мысль заключается в использовании XPath для перебора соответствующих узлов и для каждого теста узла, который другой файл (ы) узел должен быть скопирован, например:
var doc = new XPathDocument(@"C:\Some\Path.xml");
var nav = doc.CreateNavigator();
var nodeIter = nav.Select("//NodesOfInterest");
while (nodeIter.MoveNext())
{
foreach (Thing thing in ThingsThatMightGetNodes)
{
if (thing.AllowedToHaveNode(nodeIter.Current))
{
thing.WorkingXmlDoc.AppendChild(... nodeIter.Current ...);
}
}
}
В этом варианте осуществления, Thing
определяет public System.Xml.XmlDocument WorkingXmlDoc
, чтобы удерживать узлы, что это AllowedToHave()
. Однако я не понимаю, как создать новый XmlNode, который является копией nodeIter.Current.
Если есть лучший подход, я был бы рад услышать его.
Чтобы использовать XPath на двухъядерном XML-документе, ваш компьютер должен иметь> 10 ГБ оперативной памяти, возможно> 16 ГБ. Это так? –
@DimitreNovatchev: Да, да, я не знал, что XPath требует столько оперативной памяти, и это кажется довольно расточительным (это сервер, и другие процессы, безусловно, пострадают). Можете ли вы предложить другое решение? –
Я рекомендую использовать XmlReader - таким образом, вы не ограничены для ОЗУ. Ваша логика останется в основном той же. –