C# 如何对内存对象执行实时 xslt 转换?

2024-02-25

我有一个函数需要 2 个参数:1 = XML 文件,2 = XSLT 文件,然后执行转换并返回生成的 HTML。

这是函数:

/// <summary>
/// Will apply an XSLT style to any XML file and return the rendered HTML.
/// </summary>
/// <param name="xmlFileName">
/// The file name of the XML document.
/// </param>
/// <param name="xslFileName">
/// The file name of the XSL document.
/// </param>
/// <returns>
/// The rendered HTML.
/// </returns>
public string TransformXml(string xmlFileName, string xslFileName)
{
    var xtr = new XmlTextReader(xmlFileName)
                  {
                      WhitespaceHandling = WhitespaceHandling.None
                  };
    var xd = new XmlDocument();
    xd.Load(xtr);

    var xslt = new System.Xml.Xsl.XslCompiledTransform();
    xslt.Load(xslFileName);
    var stm = new MemoryStream();
    xslt.Transform(xd, null, stm);
    stm.Position = 1;
    var sr = new StreamReader(stm);
    xtr.Close();
    return sr.ReadToEnd();
}

我想更改该函数,使其不接受 XML 文件,而只接受一个对象。 如果该对象已序列化到文件,则该对象与 xslt 完全兼容。但我不想先将其序列化为文件。

回顾一下:保持 xslt 来自文件,但 xml 输入应该是我传递的对象,并且希望在没有任何文件系统交互的情况下生成 xml。


您可以将对象序列化为字符串,将字符串加载到XmlDocument,并执行转换:

public string TransformXml(object data, string xslFileName)
{

    XmlSerializer xs = new XmlSerializer(data.GetType());
    string xmlString;
    using (StringWriter swr = new StringWriter())
    {
        xs.Serialize(swr, data);
        xmlString = swr.ToString();
    }

    var xd = new XmlDocument();
    xd.LoadXml(xmlString);

    var xslt = new System.Xml.Xsl.XslCompiledTransform();
    xslt.Load(xslFileName);
    var stm = new MemoryStream();
    xslt.Transform(xd, null, stm);
    stm.Position = 0;
    var sr = new StreamReader(stm);
    return sr.ReadToEnd();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 如何对内存对象执行实时 xslt 转换? 的相关文章

随机推荐