我正在尝试使用XSL转换XML文档。我不太熟悉如何在.NET中转换XML,所以我使用了一些示例代码......
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.
答案 0 :(得分:2)
您可以尝试使用其他XslCompiledTransform.Transform method overload,即接受a String path and an XmlWriter:
的StringBuilder
as the target
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呈现为字符串感兴趣,则可以使用Transform(XmlReader, XmlWriter)
,而不使用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
方法重载:StringReader
。
XmlReader
可以(以及其他方式)使用TextReader
的具体实现进行实例化,在本例中为{{3}}。您还可以使用其他流作为输入。
当你把所有这些放在一起时,你最终会得到:
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
,因此您需要确保它们在使用后处理。
答案 1 :(得分:0)
你确定这是导致错误的中间参数吗?也许Server.MapPath("Test.xml")
返回null?