2011-03-03 94 views
3

所有的XSLT轉換使用的XmlReader,.NET中的非常大的XML文件

我不知道這是可能的,所以我想更好地在這裏問。 在C#中,我正在做很多非常大的XML文件的XSLT轉換(每個15MB) 我遇到的常見問題是XPathDocument使用太多的數據來表示格式化樹中內存中的XML。 是否可以使用基於SAX的XmlReader來使用XSLT轉換文檔?

非常感謝,

MK

+0

是的,它可以使用XMLReader,而應該用於這種處理。 – 2011-03-03 10:37:48

+0

@Furqan:有什麼我能看的例子嗎? – koumides 2011-03-03 10:47:26

+0

請參閱下面的答案。 – 2011-03-03 10:52:30

回答

-1

有一組從標準的XML控件繼承在.net庫中可用的XSL控制。

的文章,請訪問:

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"); 

     } 
    } 
} 
+0

只要將inputfile.xml作爲XmlReader加載,而不是XPathDocument或XmlDocument,這非常棒。謝謝,我會試一試。 – koumides 2011-03-03 11:00:39

+1

@koumides看起來像我失敗了這一點。雖然我提供的例子應該可以工作,但類和方法現在已經過時。使用System.Xml.Xsl.XslCompiledTransform應該爲您提供解決此問題所需的內容,並且看起來好像它可以傳遞XmlReader和XmlWriter類,因爲它是讀取和寫入參數。 – Pooli 2011-03-03 11:17:44

+0

-1用於發佈陳舊文章的陳舊內容。 – 2011-03-04 02:38:21

-1

你可以這樣做,

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

希望這將讓你去。

+0

請參閱:我面臨的常見問題是XPathDocument使用太多的數據來在樹中以格式表示內存中的XML。 – 2011-03-03 10:55:06

+0

-1:不要再使用'new XmlTextReader'。另外,XSL變換在哪裏? – 2011-03-04 02:34:46

0

我會使用類XPathNavigator(從您的XPathDocument與CreateNavigator創建)和XslCompiledTransform而不是XslTransform來執行轉換。我認爲XPathNavigator像SAX解析器一樣工作,不會將整個文件加載到內存中。

希望這會有所幫助。

1

使用XSLT 1.0,您無法避免處理器構建完整文檔的樹模型並對其進行操作,這就是XSLT 1.0的定義方式。在XSLT 3.0中,您將能夠執行streaming轉換,Saxon 9.3中已經有一個早期的實現:http://www.saxonica.com/documentation/sourcedocs/streaming.xml

另一方面,我不明白爲什麼「15MB」文件是「非常大」。在.NET平臺上使用XSLT 1.0處理這樣的文件時,是否真的內存不足?