播客 > 玩代码  >  .net使用Xslt转换Xml  | 登录  | RSS订阅地址  | Code平台

.net使用Xslt转换Xml

  在很多开发中,经常需要使用Xslt解析XML数据,生成html,Doc,或者Text,按照本人的代码经验,总结一下的文字。
  都是一个思路,首先基本上是先创建两个XmlReader对象,然后读取,然后使用XslCompiledTransform分析。.NET的表现非常明显。Asp处理的时候比较简单,判断的比较少,.NET的还会判断dtd等设置。
  (.NET使用Xlst解析XML)
  如果你的Xlt文件不包含诸如!ENTITY这种包含节点,就直接使用XslCompiledTransform(System.Xml.Xsl命名空间)类解析即可。
使用.NET 使用Xsl解析Xml文件

    public static string InvokeXmlAndXsl(string xmlfile, string xslfile){
        try{
            XslCompiledTransform transform = new XslCompiledTransform();
            transform.Load(xslfile);
            System.Text.StringBuilder SB = new System.Text.StringBuilder();
            transform.Transform(xmlfile,null,new System.IO.StringWriter(SB)); 
            return SB.ToString();
        }catch(Exception e){
            return e.Message;
        }
    }

如果你的Xslt文件比较复杂,xml文件或者xsl文件包含文件,且无明确的dtd文件的话,就必须首先创建两个XmlReader对象,然后设置settings.ProhibitDtd = false;,这样就可以分析了:

  考虑到加载的Xml可能是三种情况:文件,字符串,流,下面多态一下。
    public enum XmlType{
        File=1,String,Stream
    }

这三种情况写成枚举。
具体的代码(你可以包含到Tpl.XmlAnalyze类下面,如范例使用):


    public string InvokeXmlAndXsl(Object xmlfile, string xslfile){
        return InvokeXmlAndXsl(xmlfile,xslfile,XmlType.File);
    }
    public string InvokeXmlAndXsl(Object xmlfile, string xslfile,XmlType XmlTypeP){
        return this.InvokeXmlAndXsl(xmlfile,xslfile,XmlTypeP,null);
    }
    public string InvokeXmlAndXsl(Object xmlfile, string xslfile,XmlType XmlTypeP,XsltArgumentList Args){
        XmlReader Xr=null,XmlReadLock=null;
        try{
            XslCompiledTransform transform = new XslCompiledTransform();
            XmlReaderSettings settings =new XmlReaderSettings();
            settings.ProhibitDtd = false;
            transform.Load(Xr=XmlReader.Create(xslfile, settings));
            System.Text.StringBuilder SB = new System.Text.StringBuilder();
            if(XmlTypeP==XmlType.File){
                transform.Transform(XmlReadLock=XmlReader.Create((string)xmlfile, settings),Args,new System.IO.StringWriter(SB)); 
            }else if(XmlTypeP==XmlType.String){
                XmlDocument XD= new XmlDocument();
                XD.LoadXml((string)xmlfile);
                transform.Transform(XD,Args,new System.IO.StringWriter(SB)); 
            }else if(XmlTypeP==XmlType.Stream){
                transform.Transform(new XPathDocument((Stream)xmlfile),Args,new System.IO.StringWriter(SB)); 
            }
            return SB.ToString();
        }catch(Exception e){
            return e.Message;
        }finally{
            if(null!=Xr)Xr.Close();
            if(null!=XmlReadLock)XmlReadLock.Close();
        }
    }


使用的范例:

Tpl.XmlAnalyze Xa= new Tpl.XmlAnalyze();
this.Controls.Add(
        new LiteralControl(
        Xa.InvokeXmlAndXsl(
        App.Settings.DefaultPageXml,
        App.Settings.DefaultPageXsl,
        Tpl.XmlAnalyze.XmlType.File)
));


第一种情况的例子就不写了。其他情况类似。


天气:大雨,ccdot发表于2007-10-10 13:27:24,阅读了1452次,共有个0回复.

暂无评论

  1. 想要转载我文章的人滚远远的,能想多远,就滚多远。
  2. 不要提交任何带有网址URL信息的评论.
  3. 需要更多信息?请使用站内搜索,郁闷了?听听我在听什么吧!
用户名:*验证:看不清楚请点击刷新验证码*
内容: