【问题标题】:Passing null to `XslCompiledTransform.Transform` method将 null 传递给“XslCompiledTransform.Transform”方法
【发布时间】:2011-05-09 19:21:39
【问题描述】:

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

【问题讨论】:

  • 你得到的确切错误是什么?

标签: .net xml parameters null


【解决方案1】:

您可以尝试使用不同的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,因此您需要确保它们在使用后被丢弃。

【讨论】:

  • 感谢@Groo 提供的出色示例。如果已经将 XML 作为字符串而不是作为文件存在,该怎么办?
  • 非常感谢您添加更新。这很有意义。非常感谢您的时间和精力!
【解决方案2】:

您确定是导致错误的中间参数吗?也许Server.MapPath("Test.xml") 返回null?

【讨论】:

    猜你喜欢
    • 2010-09-07
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-17
    • 2010-11-21
    • 1970-01-01
    • 2014-11-17
    相关资源
    最近更新 更多