现在的位置: 首页 > 综合 > 正文

WebBrowser控件显示XML流

2011年08月08日 ⁄ 综合 ⁄ 共 5921字 ⁄ 字号 评论关闭

 

        VS2005里集成的WebBrowser控件,就是一个IE浏览器,如果想用它来相显示XML字符串,并达到IE的效果,我总结了一下,有如下几种方法:
        文件显示法:可以以文件的形式显示!将你要显示的XML串存到本地文件里,并将WebBrowser的Url属性指向这个文件即可!这种方法简易,有效,但不一定实用,因为大部分时间我们要做的工作是将一个XML流显示出来。当然,我们可以将XML流存到一个临时文件里,之后再用第一种方法来显示这个XML串;但是,我们还有更好的方法,不用在本地生成临时文件!
        首先,看看IE是怎样显示XML串的。当我们用IE打开XML文件时,在IE里显示的是一个按XML文档格式缩进的,并可以折起和展开的XML字符串。其实IE只是用它内嵌的XSLT文件,将XML转成了我们看到的html代码。那么同理,我们也可以将我们要显示的XML字符串用XSLT转换成html代码,并赋给WebBrowser的DocumentText属性。如果你是XSLT高手,那么你可以自己写一段XSLT,之后用如下代码来完成工作:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Xsl;
using System.IO;

namespace WindowsApplication
{
    
public partial class Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();
        }


        
private void button1_Click(object sender, EventArgs e)
        
{
            
string   xml = String.Empty;                                    //Xml字符串
            string   xslt = String.Empty;                                   //Xslt字符串

            XmlReader reader 
= null;                                        //要转换的Xml
            MemoryStream readerstream = new MemoryStream();                 //要转换的Xml流

            XmlWriter writer 
= null;                                        //转换后的字符串
            MemoryStream writerstream = new MemoryStream();                 //转换后的字符串流  
                       
            XslCompiledTransform trans 
= new XslCompiledTransform();        //Xslt对象        System.Xml.Xsl命名空间下

            MemoryStream stream 
= new MemoryStream();                       //Xslt流    
            XmlReader xsltreader = null;

            
string returnValue = String.Empty;                              //转换后的html代码  
            
            
byte[] byteArray = Encoding.UTF8.GetBytes(xslt);

            
try
            
{
                
//取得Xslt流    
                stream.Write(byteArray, 0, byteArray.Length);
                xsltreader 
= XmlReader.Create(stream);



                
//取得要转换的Xml流
                byte[] byteXml = Encoding.UTF8.GetBytes(xml);
                readerstream.Write(byteXml,
0,byteXml.Length);
                reader 
= XmlReader.Create(readerstream);


                
//取得转换后的字符串流
                writer = XmlWriter.Create(writerstream);

                trans.Load(xsltreader);

                trans.Transform(reader, writer);


                writerstream.Position 
= 0;
                returnValue 
= new StreamReader(writerstream).ReadToEnd();

                
this.webBrowser1.DocumentText = returnValue;                //将html代码赋给WebBrowser的DocumentText属性


            }

            
finally
            
{
                readerstream.Close();
                writerstream.Close();
                stream.Close();

                
if (reader != null)
                
{
                    reader.Close();
                }


                
if (writer != null)
                
{
                    writer.Close();
                }


                
if (xsltreader != null)
                
{
                    xsltreader.Close();
                }


            }


        }

    }

}

        如果很不幸,你跟我一样,对XSLT并不十分精通,也没有关系,你可以用Microsoft提供的defaultss.xsl文件,网上有很多文章介绍怎么得到这个文件。不过,如果你使用defaultss.xsl这个文件的话,就不能再用以上方法了,因为XslCompiledTransform类的Load方法,只能读取符合xslt 1.0标准的XSLT文件,但defualtss.xsl并不完全符合这个标准。那么,这时,我们可以采用另外一种方法,那就是引用COM!你可以引Microsoft XML 3.0 Parser(如果你本机安装了的话),并使用如下方法完成工作:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Xsl;
using System.IO;

namespace WindowsApplication
{
    
public partial class Form1 : Form
    
{
        
public Form1()
        
{
            InitializeComponent();
        }


        
private void button1_Click(object sender, EventArgs e)
        
{
            MSXML2.DOMDocument30Class xml 
= new MSXML2.DOMDocument30Class();        //Xml对象
            MSXML2.DOMDocument30Class xslt = new MSXML2.DOMDocument30Class();       //Xslt对象    

            xml.loadXML(
"");                                                        //读取Xml字符串
            xslt.loadXML("");                                                       //读取Xslt字符串

            
this.webBrowser1.DocumentText = xml.transformNode(xslt);                //将转换的html字符串赋给WebBrowser控件
        }

    }

}

        如果你不想有临时文件,也不想引用COM的话,那么还有如下方法可供选择,呵呵!
        正如前边所说,WebBrowser就像个IE,那么既然是IE,就会支持javascript,那么我们可以以客户端调用的方式来实现Xml文件的转换

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
    
<head>
        
<STYLE>
          BODY
{font:x-small 'Verdana';margin-right:1.5em}
          .c
{cursor:hand}
          .b
{color:red;font-family:'Courier New';font-weight:bold;text-decoration:none}
          .e
{margin-left:1em;text-indent:-1em;margin-right:1em}
          .k
{margin-left:1em;text-indent:-1em;margin-right:1em}
          .t
{color:#990000}
          .xt
{color:#990099}
          .ns
{color:red}
          .dt
{color:green}
          .m
{color:blue}
          .tx
{font-weight:bold}
          .db
{text-indent:0px;margin-left:1em;margin-top:0px;margin-bottom:0px;padding-left:.3em;border-left:1px solid #CCCCCC;font:small Courier}
          .di
{font:small Courier}
          .d
{color:blue}
          .pi
{color:blue}
          .cb
{text-indent:0px;margin-left:1em;margin-top:0px;margin-bottom:0px;padding-left:.3em;font:small Courier;color:#888888}
          .ci
{font:small Courier;color:#888888}
          PRE
{margin:0px;display:inline}
        
</STYLE>
        
<SCRIPT>
            function f(e)
{
            
if (e.className=="ci"){if (e.children(0).innerText.indexOf("\n")>0) fix(e,"cb");}
            
if (e.className=="di"){if (e.children(0).innerText.indexOf("\n")>0) fix(e,"db");}
            e.id
="";
            }

            function fix(e,cl)
{
            e.className
=cl;
            e.style.display
="block";
            j
=e.parentElement.children(0);
            j.className
="c";
            k
=j.children(

抱歉!评论已关闭.