将null传递给`XslCompiledTransform.Transform`方法

时间:2011-05-09 19:21:40

标签: .net xml parameters null

我正在尝试使用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.

2 个答案:

答案 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?