C# 什么';XmlDataDocument和XslTransform的非推荐替代方案是什么?
我正在修改一些遗留代码,试图消除警告C# 什么';XmlDataDocument和XslTransform的非推荐替代方案是什么?,c#,xslt,.net-4.0,C#,Xslt,.net 4.0,我正在修改一些遗留代码,试图消除警告XmlDataDocument和XslTransform都会生成已过时的警告。在XslTransform的情况下,建议替换为xslcomiledtransform,但不建议替换XmlDataDocument 如何更改此代码以消除.NET 4中的警告: var xmlDoc = new System.Xml.XmlDataDocument(myDataSet); var xslTran = new System.Xml.Xsl.XslTransform(); x
XmlDataDocument
和XslTransform
都会生成已过时的警告。在XslTransform
的情况下,建议替换为xslcomiledtransform
,但不建议替换XmlDataDocument
如何更改此代码以消除.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);
这确实是你的主要选择。我不能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
}
我想应该这样。当然,我只使用MemoryStream加载样式表,使用StringWriter将转换结果发送到您的代码段中。通常还有其他输入源或输出目的地,如文件、流或文本阅读器。恕我直言,如果你不知道他想做什么,那么也许你不应该回答这个问题?约翰:问题是,他目前被迫使用一个过时的API来处理XML,我很好地解决了这个问题。代码本身并不清楚它应该完成什么(尽管这主要是因为过时的API不透明),所以我给出了最好的答案。恕我直言,请不要这么快就判断.XmlDocument现在已经贬值了。您是对的,
XDocument
没有像我想的那样实现ixpathnavigatable
,但是有一个扩展方法可以从XDocument
创建XPathNavigator
:。至于转换为TextWriter
或StringWriter
,应该这样做:。非常感谢Martin,此解决方案适用于旧代码的多个部分。Martin,XDocument
没有CreateNavigator
方法,但是xslcomiledtransform.Transform
有一个重载,它接受一个XmlReader
,您可以使用XDocument.CreateReader
来获得一个合适的读取器来传递给它。John,我已经在XDocument上发布了提供CreateNavigator的扩展方法的链接,我可以再次发布它,所以我不知道你为什么声称这个方法不存在,除了被intellisense误导。但是由于扩展方法是命名空间System.Xml.XPath的一部分,intellisense只能通过using System.Xml.XPath找到它代码>我在编辑中的代码示例中也指出了这一点。
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();
}