Использование XmlReader в .NET для XSLT Преобразование очень больших файлов XML - PullRequest
3 голосов
/ 03 марта 2011

Все,

Я не уверен, возможно ли это, поэтому я подумал, что лучше спросить здесь. В C # я делаю много XSLT-преобразований очень больших XML-файлов (по 15 МБ каждый) Постоянная проблема, с которой я сталкиваюсь, заключается в том, что XPathDocument использует слишком много данных для представления XML в памяти в древовидном формате. Можно ли использовать XmlReader, основанный на SAX, для преобразования документа с использованием XSLT?

Большое спасибо,

MK

Ответы [ 4 ]

1 голос
/ 03 марта 2011

С XSLT 1.0 вы не можете избежать того, что процессор строит древовидную модель всего документа и работает с ней, как определено XSLT 1.0. В XSLT 3.0 вы сможете выполнять потоковые преобразования , уже есть ранняя реализация этого в Saxon 9.3: http://www.saxonica.com/documentation/sourcedocs/streaming.xml.

С другой стороны, я не понимаю, почему файл "15 МБ" "очень большой". Действительно ли вам не хватает памяти при обработке такого файла с помощью XSLT 1.0 на платформе .NET?

0 голосов
/ 03 марта 2011

Вы можете сделать это,

          XmlTextReader xtr = new XmlTextReader("C:\abc.xml");
          XPathDocument xp = new XPathDocument(xtr);
          XPathNavigator xpn =   xp.CreateNavigator();

Надеюсь, это поможет вам.

0 голосов
/ 03 марта 2011

Я бы использовал классы XPathNavigator (созданные из вашего XPathDocument с CreateNavigator) и XslCompiledTransform вместо XslTransform для выполнения преобразования.Я думаю, что XPathNavigator работает как SAX-парсер и не загружает весь файл в память.

Надеюсь, это поможет.

0 голосов
/ 03 марта 2011

В библиотеке .net имеется набор элементов управления XSL, которые наследуются от стандартных элементов управления Xml.

Статья доступна здесь:

http://support.microsoft.com/kb/307322

using System;
using System.Xml;
using System.Xml.Xsl; 

namespace XSLTransformation
{
    public class Class1
    {
        static void Main(string[] args)
        {
            XslTransform myXslTransform = new XslTransform();

            myXslTransform.Load("reference.xsl"); 

            myXslTransform.Transform("inputfile.xml", "outputfile.xml");

         }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...