スキップしてメイン コンテンツに移動

C#: XPath and HtmlTextWriter Example

Hey guys!! This post show you how to use XPath in C#.
I wrote program for formatting rss feed (xml) to html for its example.

XPath in C#

The simplest way is just creating XmlDocument and call SelectNodes method.
var xmlString = "some xml string...."

// create XmlDocment
var doc = new XmlDocument();
doc.LoadXml(xmlString);

// selecting nodes by xpath string
doc.SelectNodes("/rss/channel/item");


RSS Xml to Html Example

Okay here is a simple XPath example - converting rss xml to html.
using System.IO;
using System.Web.UI;
using System.Web;

namespace Utility
{
    public class RSStoHtmlWriter : HTMLWriteHelper
    {
        private readonly string url;
        public RSStoHtmlWriter(string url)
        {
            this.url = url;
        }

        public override void WriteBody(HtmlTextWriter htmlWriter)
        {
            using (var reader = new XmlTextReader(url))
            {
                // **** using XPath!! ****
                // As you notice, ToXmlDocument is not implemented in XmlTextReader.
                // I wrote it as an extension method. Pls see bottom of this post.
                foreach (var item in reader.ToXmlDocument().SelectNodes("/rss/channel/item"))
                {
                    var node = item as XmlNode;
                    if (node != null)
                    {
                        WriteItem(htmlWriter, node);
                    }
                }
            }
        }

        // render xml node as html
        protected void WriteItem(HtmlTextWriter htmlWriter, XmlNode node)
        {
            string title = HttpUtility.HtmlDecode(node.SelectSingleNode("./title").FirstChild.Value);
            string pubDate = HttpUtility.HtmlDecode(node.SelectSingleNode("./pubDate").FirstChild.Value);

            htmlWriter.RenderBeginTag(HtmlTextWriterTag.H2);
            htmlWriter.Write(title);
            htmlWriter.RenderEndTag();
            htmlWriter.Write(FormatPubDate(pubDate));
            htmlWriter.WriteBreak();
            htmlWriter.WriteBreak();
            htmlWriter.RenderBeginEndTag(HtmlTextWriterTag.Hr); // extension method again
        }

        protected static string FormatPubDate(string pubDate)
        {
            int index = pubDate.IndexOf(" +");
            if (index > 0)
            {
                pubDate = pubDate.Remove(index);
            }
            return string.Format("{0:MM/dd/yyyy hh:mm tt}", DateTime.Parse(pubDate));
        }

    }
}


Trivial Utility Methods

The following classes and methods are just for trivial helper stuffs used above example.
For Html rendering.
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.IO;
using System.Web.UI;

namespace Utility
{
    public static class HttpUtils
    {
        // extension method for rendering empty html tag quickly
        public static void RenderBeginEndTag(this HtmlTextWriter htmlWriter, HtmlTextWriterTag tag)
        {
            htmlWriter.RenderBeginTag(tag);
            htmlWriter.RenderEndTag();
        }

    }
}

For XmlDocument creation.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;

namespace Utility
{
    public static class XMLUtils
    {
        // trivial extension method for creating XmlDocumen from XmlReader
        public static XmlDocument ToXmlDocument(this XmlReader reader)
        {
            var doc = new XmlDocument();
            doc.Load(reader);
            return doc;
        }

    }
}


This is simple abstract template class for helping html rendering, nothing special.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.UI;
using System.IO;

namespace Utility
{
    public abstract class HTMLWriteHelper
    {

        public virtual void WriteBody(HtmlTextWriter htmlWriter){}

        public virtual void WriteHeader(HtmlTextWriter htmlWriter){}

        
        public void WriteToFile(string filepath)
        {
            using (var streamWriter = new StreamWriter(filepath, false))
            {
                WriteTo(streamWriter);
            }
        }

        public void WriteTo(TextWriter textWriter)
        {
            using (var htmlWriter = new HtmlTextWriter(textWriter))
            {
                htmlWriter.RenderBeginTag(HtmlTextWriterTag.Html);
                htmlWriter.RenderBeginTag(HtmlTextWriterTag.Head);

                WriteHeader(htmlWriter);

                htmlWriter.RenderEndTag();
                htmlWriter.RenderBeginTag(HtmlTextWriterTag.Body);

                WriteBody(htmlWriter);

                htmlWriter.RenderEndTag();
                htmlWriter.RenderEndTag();
                htmlWriter.Close();
            }
        }
    }
}

コメント

carbon さんの投稿…
csharp mouse examples
Ellipse Mouse Down event