Преобразование XSLT на Больших XML-файлах с C#

У меня есть некоторые очень большие XML-файлы (800 МБ к 1,5 ГБ). Я должен применить XSLT на это. Я могу считать его XMLTextReader. Когда я применил преобразование XSLT, получите Исключение SystemOutOfMemory.

Мой код похож;

static void Main(string[] args)
{
    XDocument newTree = new XDocument();
    XmlTextReader oReader = new XmlTextReader(@"C:\Projects\myxml.xml");


    using (XmlWriter writer = newTree.CreateWriter())
    {
        XslCompiledTransform oTransform = new XslCompiledTransform();
        oTransform.Load(@"C:\Projects\myXSLT.xsl");
        oTransform.Transform(oReader, writer);
    }
    Console.WriteLine(newTree);
}

Заранее спасибо. Это очень срочно. Если я не получаю решения, я должен разделить XML на меньший XML и сделать преобразование.

5
задан John Saunders 4 March 2011 в 02:39
поделиться

3 ответа

XSLT использует XPath, а это требует, чтобы весь XML документ хранился в памяти. Таким образом, проблема нехватки памяти существует по определению.

Существуют простые правила, позволяющие приблизительно определить, сколько памяти необходимо, и одно из них гласит 5 * text-size.

Таким образом, для "типичного XML-файла размером 1,5 ГБ" может быть достаточно 8 ГБ оперативной памяти.

Либо разбейте документ на более мелкие части, либо дождитесь реализации XSLT 2.1, которая определяет специальные потоковые инструкции. Тем временем можно использовать последнюю (коммерческую) версию Saxon, в которой реализованы расширения для потоковой передачи данных и об успешной обработке 64 ГБ документа сообщалось в twitter.

6
ответ дан 14 December 2019 в 04:30
поделиться

, мы сталкиваемся с аналогичной проблемой. Решение, с которым мы пришли, заключалось в том, чтобы не использовать xslt для этого случая, а вместо этого использовать преобразования Linq в Xml при передаче данных. Вы можете использовать ключевое слово c # yield для перебора XML-потока и обработки файла по частям. См. потоковая передача с linq в xml

природа xslt требует, чтобы xml был загружен в память.что должно произойти, так это разбить большой файл на более управляемые части. если вы используете технику потоковой передачи xml, вы можете разбить документ на подэлементы, к которым затем можно индивидуально применить xslt. вам, возможно, придется переписать xslt, чтобы учесть такое поведение.

Помимо этого, единственный другой вариант - добавить к нему больше оборудования, но это может даже потребовать обновления операционной системы в зависимости от ограничений ОЗУ ...

2
ответ дан 14 December 2019 в 04:30
поделиться

Не знаю, сильно ли это поможет, но вот код, который я использую для преобразования больших файлов:

   XPathDocument myXPathDoc = new XPathDocument("xmfile.xml");
   XslCompiledTransform myXslTrans = new XslCompiledTransform() ;
   XsltSettings st = new XsltSettings(true, true);
   myXslTrans.Load("StyleSheet.xslt", st, null);
   StreamWriter s =new StreamWriter("output-fie.xslt");

   XsltArgumentList ln = new XsltArgumentList();
   // some xslt argument processing stuff            
   myXslTrans.Transform(myXPathDoc, ln, s);

Это может занять некоторое время, но, похоже, это помогает.

0
ответ дан 14 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: