May 11, 2011

XML to HTML

To convert XML to HTML you need an XSL (XSLT) file and some application to transform the XML to HTML using this XSL file. Usually this work is done by the browser, by including a link to the XSL file in the XML file, when you open the file in a browser it runs the transform on the XML using the XSL file you've pointed to.
But I wanted to run this as a seperate step from a batch file so that I can create my .html files on disk but maintain their content using XML.
Here's how I've done it:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Xsl;
using System.IO;
 
 
namespace Tool.XMLToHTML
{
    class Program
    {
        /// <summary>
        /// "Help\Help3\_HelpSource\gravity.xslt" "Help\Help3\_HelpSource"
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            
            try
            {
                Console.WriteLine("\n");
                Console.WriteLine("\tTransform xslt + xml to html.");
                Console.WriteLine("\n");
                
                
                if (args.Length != 2)
                    throw new ArgumentException("2 args required, .xslt file and the .xml file or directory");
                if (!args[0].ToString().Contains(".xslt"))
                    throw new ArgumentException(".xslt file expected as first arg");
                string xmlSourceLocation = Path.GetDirectoryName(args[1] + Path.DirectorySeparatorChar);
                if (!args[1].ToString().Contains(".xml"))
                {
                    if (!Directory.Exists(Path.GetDirectoryName(args[1] + Path.DirectorySeparatorChar)))
                         throw new ArgumentException(string.Format("Directory {0} does not exist."Path.GetDirectoryName(args[1]+Path.DirectorySeparatorChar)));
                    else
                       if(Directory.GetFiles(args[1], "*.xml").Length ==0)
                           throw new ArgumentException(string.Format("Directory {0} does not contain .xml files."args[1]));
                }
 
                Console.WriteLine("\n");
                Console.WriteLine("\tTakes the fullpath to the .xslt");
                Console.WriteLine("\tand the full path to the .xml or the directory containing the .xml.");
                Console.WriteLine("\tTransforms to .html files, in an output directory below the xml source location 'htmlOutput' i.e. {0}"Path.Combine(Path.GetDirectoryName(args[1]), "htmlOutput"));
                Console.WriteLine("\n");
 
                
 
 
                // Load the style sheet. 
                XslCompiledTransform xslt = new XslCompiledTransform();
                xslt.Load(args[0]);
 
                string rootPath = Path.GetDirectoryName(args[1] + Path.DirectorySeparatorChar);
                string htmlOutputPath = Path.Combine(rootPath"htmlOutput");
                Directory.CreateDirectory(htmlOutputPath);
 
                if (Directory.Exists(xmlSourceLocation))
                {
                    string[] fileNames = Directory.GetFiles(xmlSourceLocation"*.xml");
 
                    foreach (string xmlFileName in fileNames)
                        xslt.Transform(xmlFileNamePath.Combine(htmlOutputPathPath.GetFileNameWithoutExtension(xmlFileName) + ".html"));
                }
                else//single file
                    xslt.Transform(args[1], Path.Combine(htmlOutputPathPath.GetFileNameWithoutExtension(args[1]) + ".html"));
                
                Console.WriteLine("\tSuccess. HTML output can be found at {0}\n"htmlOutputPath);
            }
            catch (Exception e)
            {
                Console.WriteLine("\n");
                Console.WriteLine("\tFailure. Transform to HMTL failed.");
                Console.WriteLine("\t" + e.Message);
                Console.WriteLine("\n");
            }
            
 
        }
    }
}

No comments: