2012-08-30 43 views
7

我正在修改一些遺留代碼以嘗試消除警告。 XmlDataDocumentXslTransform都會生成警告,說明它們已過時。在XslTransform的情況下,建議的替換爲XslCompiledTransform,但不建議替換爲XmlDataDocument什麼是XmlDataDocument和XslTransform的不推薦使用的替代方法?

我怎樣才能改變這種代碼,以消除在.NET 4警告:

var xmlDoc = new System.Xml.XmlDataDocument(myDataSet); 
var xslTran = new System.Xml.Xsl.XslTransform(); 
xslTran.Load(new XmlTextReader(myMemoryStream), null, null); 
var sw = new System.IO.StringWriter(); 
xslTran.Transform(xmlDoc, null, sw, null); 

回答

6
XDocument doc = new XDocument(); 
using (XmlWriter xw = doc.CreateWriter()) 
{ 
    myDataSet.WriteXml(xw); 
    xw.Close(); 
} 

XslCompiledTransform proc = new XslCompiledTransform(); 
using (XmlReader xr = XmlReader.Create(myMemoryStream)) 
{ 
    proc.Load(xr); 
} 

string result; 

using (StringWriter sw = new StringWriter()) 
{ 
    proc.Transform(doc.CreateNavigator(), null, sw); // needs using System.Xml.XPath; 
    result = sw.ToString(); 
} 

應該做的,我認爲。當然,我只使用MemoryStream來加載樣式表和StringWriter,以便將代碼片段用於發送變換結果。通常還有其他輸入源或輸出目標,如文件,流或TextReader。

+0

你說得對,'XDocument'沒有像我想的那樣實現'IXPathNavigable',但是有一個擴展方法可以從'XDocument'創建'XPathNavigator':http://msdn.microsoft.com/en-us/library /bb299124.aspx。至於轉換爲'TextWriter'或'StringWriter',應該這樣做:http://msdn.microsoft.com/en-us/library/ms163435.aspx。 –

+0

非常感謝Martin,此解決方案適用於舊代碼的多個部分。 –

+0

Martin,'XDocument'沒有'CreateNavigator'方法,但'XslCompiledTransform.Transform'有一個接受'XmlReader'的重載,您可以使用'XDocument.CreateReader'來獲得一個合適的閱讀器傳遞給它。 –

5

XMLDocument真的是你的主要選擇。我不是100%肯定你想與你發佈的代碼塊做什麼,而是你可以給這樣的一個鏡頭:

public void DoThingsWithXml() 
{ 
    string strXdoc = src.GetTheXmlString(); // however it is you do it 
    XmlDocument xdoc = new XmlDocument(); 
    xdoc.LoadXml(strXdoc); 
    // The other things you need to do 
} 
+1

尊重,如果你不知道他想做什麼,那麼也許你不應該回答這個問題?因爲你沒有解決這個問題,所以我不得不倒下你。 –

+2

@John:問題在於他目前被迫使用過時的API來處理XML,這一點我很好。代碼本身並不清楚它應該達到的效果(儘管這主要是過時API的不透明度的缺點),所以我給出了我可以得到的最佳答案。請尊重,儘量不要這麼快判斷。 – tmesser

相關問題