// Copyright 2005 by Omar Al Zabir. All rights are reserved.
//
// If you like this code then feel free to go ahead and use it.
// The only thing I ask is that you don't remove or alter my copyright notice.
//
// Your use of this software is entirely at your own risk. I make no claims or
// warrantees about the reliability or fitness of this code for any particular purpose.
// If you make changes or additions to this code please mark your code as being yours.
//
// website http://www.oazabir.com, email OmarAlZabir@gmail.com, msn oazabir@hotmail.com
using System;
using System.Text;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Xsl;
using System.Collections;
using System.IO;
using GotDotNet.Exslt;
using RSSBlogAPI;
namespace RSSFeeder.Helpers{
/// <summary>
/// Helper class for XML related activities
/// </summary>
public class XMLHelper
{
public static ExsltTransform GetTransformer( string path )
{
ExsltTransform transform = (ExsltTransform) EntLibHelper.GetCachedObject( path );
if( null != transform )
{
return transform;
}
else
{
transform = new ExsltTransform();
transform.SupportedFunctions = ExsltFunctionNamespace.All;
transform.MultiOutput = false;
transform.Load(path);
EntLibHelper.StoreInCache( path, transform );
return transform;
}
}
/// <summary>
/// Transforms specified XML using the specified XSL file to the output stream
/// </summary>
/// <param name="xsltFile">Full path to an XSL file</param>
/// <param name="xml">A complete XML which can be loaded in a document</param>
/// <param name="outputStream">A stream where output will be written</param>
public static void TransformXml (string xsltFile, TextReader reader, Stream outputStream)
{
ExsltTransform transformer = GetTransformer( xsltFile );
//ExsltTransform transformer = new ExsltTransform();
//transformer.Load(xsltFile);
try
{
XmlTextReader xmlReader = new XmlTextReader( reader );
xmlReader.Namespaces = false;
XPathDocument document = new XPathDocument( xmlReader );
HtmlWriter writer = new HtmlWriter( outputStream, RSSCommon.Constants.DefaultEncoding );
transformer.Transform( document, null, writer );
}
catch( Exception x )
{
ErrorReportForm.QueueErrorReport( new ErrorReportItem( x.Message, x.ToString() ) );
}
}
public static void TransformXml (string xsltFile, string xml, Stream outputStream)
{
TransformXml( xsltFile, new StringReader( xml ), outputStream );
}
/// <summary>
/// Generates an XML file which contains a referene to the XSLT file which browsers
/// use to transform the XML automatically
/// </summary>
/// <param name="xsltFileName"></param>
/// <param name="xml"></param>
/// <param name="outputStream"></param>
public static void GenerateXMLForChannel( string xsltFileName, string xml, Stream outputStream )
{
// Prepare a header which includes reference to the XSLT file
string header = "<?xml version=\"1.0\" encoding=\"utf-8\"?><?xml-stylesheet type=\"text/xsl\" href=\"{0}\"?>";
using( StreamWriter writer = new StreamWriter( outputStream, RSSCommon.Constants.DefaultEncoding ) )
{
writer.WriteLine( string.Format( header, xsltFileName ) );
writer.WriteLine( xml );
writer.Flush();
}
}
}
}
|