2012-08-10 93 views
0

我使用下面的代碼記憶轉化C#XSLT

XmlDocument XmlDoc = new XmlDocument(); 
XmlDoc.LoadXml(DS.GetXml()); 
XslCompiledTransform XsltTranformation = new XslCompiledTransform(); 
XsltTranformation.Load(@"C:\Users\maskew\Desktop\XSLTMapping.xsl"); 
Stream XmlStream = new MemoryStream(); 
XmlDoc.Save(XmlStream); //Stream is still blank after this line 
XmlReader XmlRdr = XmlReader.Create(XmlStream); 
MemoryStream stm = new MemoryStream(); 
XsltTranformation.Transform(XmlRdr, null, stm); 
stm.Position = 1; 
StreamReader sr = new StreamReader(stm); 
string Output = sr.ReadToEnd(); 
Output = Output.Substring(2); 
XmlDoc.LoadXml(Output); 
XmlWriter XmlWrtr = XmlWriter.Create(@"C:\Users\maskew\Desktop\XmlMapping.xml"); 
XmlDoc.WriteTo(XmlWrtr); 
XmlWrtr.Flush(); 
XmlWrtr.Close(); 

但是當前運行的活動「內存」 XSLT轉換,當我從XmlDocument的移動文件在第6行到MemoryStream的流包含什麼當檢查時,從而停止整個程序運行。

有沒有人有任何想法,爲什麼會發生?

更新:該流包含現在的信息,但XmlReader對象仍然沒有收到它。

+0

你是如何確認該流爲空?你正在檢查長度還是試圖從中讀取? – detaylor 2012-08-10 08:00:11

+0

正試圖從中讀取,關閉檢查顯示包含700多個字符的流,然後影響我的開場白問題。當移動到有問題的XmlReader並且沒有任何內容進入Reader時,現在是下面的行。 – Mike 2012-08-10 08:06:27

回答

2

嘗試simplyfying

XmlDocument xmlDoc = new XmlDocument(); 
xmlDoc.PreserveWhitespace = true; 
xmlDoc.LoadXml(DS.GetXml()); 

// Create a writer for writing the transformed file. 
XmlWriter writer = XmlWriter.Create(@"C:\Users\maskew\Desktop\XmlMapping.xml"); 

// Create and load the transform with script execution enabled. 
XslCompiledTransform transform = new XslCompiledTransform(); 
XsltSettings settings = new XsltSettings(); 
settings.EnableScript = true; 
transform.Load(@"C:\Users\maskew\Desktop\XSLTMapping.xsl", settings, null); 

// Execute the transformation. 
transform.Transform(xmlDoc, writer); 
+0

我不得不提供它作爲一個流由於xslt刪除空白,並且不能用一個已編譯的XmlDocument做到這一點,已經嘗試過它。 – Mike 2012-08-10 08:11:53

+0

我更新了代碼以保留空格,(第2行)你試過這個嗎? – 2012-08-10 08:26:08

+0

這適用於從我的XSLT工作表中刪除空白空白並將.PreserveWhitespace更改爲false以代替它。 - 由於這是一個更簡單的實現,因此將接受程度提高了 – Mike 2012-08-10 08:32:23

1
Stream XmlStream = new MemoryStream(); 

怎麼可能有東西在裏面?您正在構建一個空的MemoryStream ...

編輯:

你應該嘗試使用「使用」指令澄清(http://msdn.microsoft.com/fr-fr/library/yh598w02)。基本上像StreamReader,MemeryStream等類實現了IDisposable接口。如果你使用它們來包裝它,它會自動爲你處理對象。

+0

XmlDoc.Save(XmlStream);將xml文檔保存到該行下方的流中。 – Mike 2012-08-10 08:03:03

+0

您使用的是哪個版本的.NET框架? – h1ghfive 2012-08-10 08:06:25

+0

它是在2.0上,因爲我不打算使用2.0而改爲4.0 :) – Mike 2012-08-10 08:10:34

1

嘗試刷新和重置流:

XmlDoc.Save(XmlStream); 
XmlStream.Flush(); 
XmlStream.Position = 0; 
XmlReader XmlRdr = XmlReader.Create(XmlStream); 
+0

已經這麼做了,仔細檢查一下這個流現在看起來不是問題,更新了原始問題。 – Mike 2012-08-10 08:08:07