传递null以`XslCompiledTransform.Transform`方法 [英] Passing null to `XslCompiledTransform.Transform` method

查看:305
本文介绍了传递null以`XslCompiledTransform.Transform`方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图改造和使用XSL的XML文档。我不是太熟悉如何,所以我用了一些例如code来转换XML在.NET ...

I am trying to transform and XML document using XSL. I am not too familiar with how to transform XML in .NET so I am using some example code ...

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); 

我遇到的问题是以下行...

The problem I am running into is the following line ...

xslTransformer.Transform(Server.MapPath("Test.xml"), null, ms);

编译器显示在传递来变换方法的错误。在着眼于变换方法签名,它看起来像参数重新presenting是各种选项的改造。在Visual Studio IDE甚至表明,这个值可以是。我也尝试过使用的DBNull.Value 但也显示了一个错误。任何想法,我缺少的是什么?

The compiler is showing an error in passing in null to the Transform method. In looking at the Transform method signatures it looks like the parameter null is representing is various options for the transformation. The Visual Studio IDE even shows that this value can be null. I also tried using DBNull.Value but that also shows an error. Any idea what I am missing?

更新:我收到的错误是双重的。 (1)首先,有人告诉我不再支持,我应该使用 System.DBNull 。 (2)当我改变 System.DBNull 我得到一个错误说重载解析失败,因为没有可访问的变换可以用这些参数调用。

UPDATE: The error I am receiving is two-fold. (1) First I am told that null is no longer supported and I should use System.DBNull. (2) Once I change null to System.DBNull I get an error saying overload resolution failed because no accessible Transform can be called with these arguments.

推荐答案

您可以尝试使用不同的 XslCompiledTransform.Transform方法重载,它接受一个的一个String路径和XmlWriter的

You can try using a different XslCompiledTransform.Transform method overload, the one which accepts 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 作为目标,没有一个的MemoryStream ,并简化您的code到:

Actually, if you are only interesting in rendering XML to a string, you can use a StringBuilder as the target, without a MemoryStream, and simplify your code to:

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 方法重载:的 变换(XmlReader的,的XmlWriter)

If the input XML is in a string, then you can use yet another XslCompiledTransform.Transform method overload: Transform(XmlReader, XmlWriter).

的XmlReader 即可(在其他方面),通过具体的实施的TextReader 的实例,在这种情况下< A HREF =htt​​p://msdn.microsoft.com/en-us/library/system.io.stringreader.aspx相对=nofollow> StringReader 。您也可以使用其他的流作为输入。

XmlReader can be (among other ways) instantiated using a concrete implementation of TextReader, in this case a StringReader. You can also use an other stream as input.

当你把所有的一起,你应该结束了:

When you put all that together, you should end up with:

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 ,所以你需要确保他们使用后废弃。

All of these classes implement IDisposable, so you need to make sure they are disposed after use.

这篇关于传递null以`XslCompiledTransform.Transform`方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆