2011-05-09 78 views
2

我正在嘗試使用XSL轉換和XML文檔。我不是太熟悉如何,所以我用一些示例代碼在.NET轉換XML ...將null傳遞給`XslCompiledTransform.Transform`方法

XslCompiledTransform xslTransformer = new XslCompiledTransform(); 
xslTransformer.Load(Server.MapPath("Test.xslt")); 

MemoryStream ms = new MemoryStream(); 
xslTransformer.Transform(Server.MapPath("Test.xml"), null, ms); 

ms.Seek(0, SeekOrigin.Begin); 
StreamReader sr = new StreamReader(ms); 
string output = sr.ReadToEnd(); 
ms.Close(); 

Response.Write(output); 

我遇到的是以下行的問題...

xslTransformer.Transform(Server.MapPath("Test.xml"), null, ms); 

編譯器在將null傳遞給Transform方法時顯示錯誤。在查看Transform方法簽名時,它看起來像參數null表示的是用於轉換的各種選項。 Visual Studio IDE甚至顯示此值可以是null。我也嘗試使用DBNull.Value,但也顯示錯誤。任何想法我失蹤?

更新:我收到的錯誤是雙重的。 (1)首先,我被告知不再支持null,我應該使用System.DBNull。 (2)一旦我將null更改爲System.DBNull我收到錯誤說明overload resolution failed because no accessible Transform can be called with these arguments.

+2

你得到了什麼確切的錯誤? – 2011-05-09 19:25:37

回答

2

您可以嘗試使用不同的XslCompiledTransform.Transform method overload,它接受a String path and an XmlWriter之一:

XslCompiledTransform xslTransformer = new XslCompiledTransform(); 
xslTransformer.Load(Server.MapPath("Test.xslt")); 

// XmlWriter allows you to specify additional settings 
XmlWriterSettings settings = new XmlWriterSettings(); 
settings.OmitXmlDeclaration = true; 
settings.ConformanceLevel = ConformanceLevel.Fragment; 
settings.CloseOutput = false; 

using (MemoryStream ms = new MemoryStream()) 
{ 
    using (XmlWriter writer = XmlWriter.Create(ms, settings)) 
    { 
     xslTransformer.Transform(Server.MapPath("Test.xml"), writer); 
    } 

    ms.Seek(0, SeekOrigin.Begin); 
    StreamReader sr = new StreamReader(ms); 
    string output = sr.ReadToEnd(); 
    ms.Close(); 
} 

Response.Write(output); 

其實,如果你只在渲染XML爲字符串有趣,你可以使用一個StringBuilder as the target,沒有MemoryStream,和簡化您的代碼:

XslCompiledTransform xslTransformer = new XslCompiledTransform(); 
xslTransformer.Load(Server.MapPath("Test.xslt")); 

StringBuilder sb = new StringBuilder(); 
using (XmlWriter writer = XmlWriter.Create(sb)) 
{ 
    xslTransformer.Transform(Server.MapPath("Test.xml"), writer); 
} 

Response.Write(sb.ToString()); 

[編輯](根據您的評論)

如果輸入XML在一個字符串中,那麼您可以使用另一個XslCompiledTransform.Transform方法重載:Transform(XmlReader, XmlWriter)

XmlReader可以(通過其他方式)使用TextReader的具體實施來實例化,在這種情況下爲StringReader。您也可以使用其他流作爲輸入。

當你把所有的一起,你應該結束了:

string input = @"<SomeXml />" 
StringBuilder output = new StringBuilder(); 
using (StringReader strReader = new StringReader(input)) 
{ 
    using (XmlReader reader = XmlReader.Create(strReader)) 
    { 
     using (XmlWriter writer = XmlWriter.Create(output)) 
     { 
      xslTransformer.Transform(reader, writer); 
     } 
    } 
} 
Response.Write(output.ToString()); 

所有這些類的實現IDisposable,所以你需要確保他們使用後丟棄。

+0

謝謝你的優秀示例@Groo。如果一個人已經將XML作爲一個字符串而不是作爲一個文件存在? – webworm 2011-05-10 16:41:49

+0

@webworm:我已經更新了答案。 – Groo 2011-05-11 11:24:11

+0

非常感謝您添加更新。這很有道理。非常感謝您的時間和精力! – webworm 2011-05-11 13:26:21

0

您確定它是導致錯誤的中間參數嗎?也許Server.MapPath("Test.xml")返回null?