用户操作
[即时聊天] [发私信] [加为好友]
不会飞的鱼ID:isaaq
18031次访问,排名6636好友75人,关注者71
以前做过程序员,
也做过项目经理,
还做过技术总监,
目前在做总经理。
isaaq的文章
原创 29 篇
翻译 2 篇
转载 1 篇
评论 17 篇
不会飞的鱼的公告
本博客文章可以任意转载
转载时请标明原始出处和作者信息
谢谢合作
最近评论
isaaq:如果想弄明白ABC code和OP code先看看Tamarin系列的其他文章吧
jix:如果不引入就不能操作页面元素了,过于独立,我很想用类似javascript的eval功能,另外如你所说"
也就是说脚本引擎引入的ABC文件里需要有这个this对应的类的ABC code"我不太明白,如何将this编译为abc code,并引用呢?我看官方也没有这样的例子

还有一个问题关于import的
import mx.controls.Aler……
isaaq:最好不要把大对象传入脚本引擎,脚本引擎主要是灵活方便和动态地执行某些简易方法,其本身功能目前还是十分弱。如果你想把this传入,那么this属于的类必须得是脚本引擎的支持范围之内。也就是说脚本引擎引入的ABC文件里需要有这个this对应的类的ABC code。
如果这样的话,就是把这个类编译为ABC code再加入到引擎中,这样反而不是很灵活了
jix:可以看出Util.print来自eval外部,但是测试通过,说明eval脚本引擎可以与外部类和方法进行沟通。

请问如何将this传给eval
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"……
nhconch:有意思!
文章分类
收藏
    相册
    存档
    软件项目交易
    订阅我的博客
    XML聚合  FeedSky
    订阅到鲜果
    订阅到Google
    订阅到抓虾
    订阅到BlogLines
    订阅到Yahoo
    订阅到GouGou
    订阅到飞鸽
    订阅到Rojo
    订阅到newsgator
    订阅到netvibes

    原创 .NET中利用Ebay的XSLT模板转换XML到JSON收藏

    新一篇: .NET下的简单AJAX处理库 | 旧一篇: 极限编程·印象

    从XML转换到JSON的方法有多种, 不过都要依赖第三方的库来实现转化,不过有了eBay提供的xml-2-json.xlst模板,你会发现转换原来很轻松.

    xml-2-json.xslt的代码大致如下(稍做了点改动):

    <?xml version="1.0" encoding="UTF-8"?>
    <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" xmlns:ebl="urn:ebay:apis:eBLBaseComponents" exclude-result-prefixes="ebl">
        
    <!--====================================================================================
        Original version by : Holten Norris ( holtennorris at yahoo.com )
        Current version maintained  by: Alan Lewis (alanlewis at gmail.com)
        Thanks to Venu Reddy from eBay XSLT team for help with the array detection code
        Protected by CDDL open source license.  
        Transforms XML into JavaScript objects, using a JSON format.
        ===================================================================================== 
    -->
        
    <xsl:output method="text" encoding="UTF-8"/>
        
    <xsl:template match="*">
            
    <xsl:param name="recursionCnt">0</xsl:param>
            
    <xsl:param name="isLast">1</xsl:param>
            
    <xsl:param name="inArray">0</xsl:param>
            
    <xsl:if test="$recursionCnt=0">
                
    <xsl:text>json = {</xsl:text>
            
    </xsl:if>
            
    <!-- test what type of data to output  -->
            
    <xsl:variable name="elementDataType">
                
    <xsl:value-of select="number(text())"/>
            
    </xsl:variable>
            
    <xsl:variable name="elementData">
                
    <!-- TEXT ( use quotes ) -->
                
    <xsl:if test="string($elementDataType) ='NaN'">
                    
    <xsl:if test="boolean(text())">
                    "
    <xsl:value-of select="text()"/>"
                    
    </xsl:if>
                
    </xsl:if>
                
    <!-- NUMBER (no quotes ) -->
                
    <xsl:if test="string($elementDataType) !='NaN'">
                    
    <xsl:value-of select="text()"/>
                
    </xsl:if>
                
    <!-- NULL -->
                
    <xsl:if test="not(*)">
                    
    <xsl:if test="not(text())">
                        null
                    
    </xsl:if>
                
    </xsl:if>
            
    </xsl:variable>
            
    <xsl:variable name="hasRepeatElements">
                
    <xsl:for-each select="*">
                    
    <xsl:if test="name() = name(preceding-sibling::*) or name() = name(following-sibling::*)">
                        true
                    
    </xsl:if>
                
    </xsl:for-each>
            
    </xsl:variable>
            
    <xsl:if test="not(count(@*) &gt; 0)">
             "
    <xsl:value-of select="local-name()"/>": <xsl:value-of select="$elementData"/>
            
    </xsl:if>
            
    <xsl:if test="count(@*) &gt; 0">
            "
    <xsl:value-of select="local-name()"/>": {
            "content": 
    <xsl:value-of select="$elementData"/>
                
    <xsl:for-each select="@*">
                    
    <xsl:if test="position()=1">,</xsl:if>
                    
    <!-- test what type of data to output  -->
                    
    <xsl:variable name="dataType">
                        
    <xsl:value-of select="number(.)"/>
                    
    </xsl:variable>
                    
    <xsl:variable name="data">
                        
    <!-- TEXT ( use quotes ) -->
                        
    <xsl:if test="string($dataType) ='NaN'">
                    "
    <xsl:value-of select="current()"/></xsl:if>
                        
    <!-- NUMBER (no quotes ) -->
                        
    <xsl:if test="string($dataType) !='NaN'">
                            
    <xsl:value-of select="current()"/>
                        
    </xsl:if>
                    
    </xsl:variable>
                    
    <xsl:value-of select="local-name()"/>:<xsl:value-of select="$data"/>
                    
    <xsl:if test="position() !=last()"></xsl:if>
                
    </xsl:for-each>
            }
            
    </xsl:if>
            
    <xsl:if test="not($hasRepeatElements = '')">
                        [{
                    
    </xsl:if>
            
    <xsl:for-each select="*">
                
    <xsl:if test="position()=1">
                    
    <xsl:if test="$hasRepeatElements = ''">
                        
    <xsl:text> { </xsl:text>
                    
    </xsl:if>
                
    </xsl:if>
                
    <xsl:apply-templates select="current()">
                    
    <xsl:with-param name="recursionCnt" select="$recursionCnt+1"/>
                    
    <xsl:with-param name="isLast" select="position()=last()"/>
                    
    <xsl:with-param name="inArray" select="not($hasRepeatElements = '')"/>
                
    </xsl:apply-templates>
                
    <xsl:if test="position()=last()">
                    
    <xsl:if test="$hasRepeatElements = ''">
                        
    <xsl:text> } </xsl:text>
                    
    </xsl:if>
                
    </xsl:if>
            
    </xsl:for-each>
            
    <xsl:if test="not($hasRepeatElements = '')">
                        }]
                    
    </xsl:if>
            
    <xsl:if test="not( $isLast )">
                
    <xsl:if test="$inArray = 'true'">
                    
    <xsl:text> } </xsl:text>
                
    </xsl:if>
                , 
                
    <xsl:if test="$inArray = 'true'">
                    
    <xsl:text> { </xsl:text>
                
    </xsl:if>
            
    </xsl:if>
            
    <xsl:if test="$recursionCnt=0"> }; </xsl:if>
        
    </xsl:template>
    </xsl:stylesheet>

     从上面的代码可以看出,只要给出相应的XML在应用此XLST样式就可以实现转化了。

    不过为了方便,还是封装一层,以便我们能更好地在.NET下完成任务:

    首先,是一个通用的转换方法,它可以读出流,然后应用XSLT样式:

     

    private static string XML2JSon(Stream rd,int type) 
            
    {
                XmlDocument doc 
    = new XmlDocument();
                rd.Position
    =0;
                doc.Load(rd);

                XmlElement root 
    = doc.DocumentElement;
                XmlNodeList nl;
                
    if(type == 0)
                     nl 
    = root.SelectNodes("//Table1");
                
    else
                     nl 
    = root.ChildNodes;
                XmlDocument srcdoc 
    = new XmlDocument();
                
    string temp =null;
                
    foreach(XmlNode xn in nl) 
                
    {
                    
    if(type==0)
                        temp 
    += xn.InnerXml;
                    
    else
                        temp 
    += xn.OuterXml;
                }

                temp 
    = "<result>" + temp + "</result>";
                srcdoc.InnerXml 
    = temp;

                XPathNavigator nav 
    = srcdoc.CreateNavigator();

                XslTransform xt 
    = new XslTransform();

                
    string path = ConfigurationSettings.AppSettings["ServerPath"];
                xt.Load(path 
    + "css/xml-2-json.xsl");

                Stream w 
    = new MemoryStream();
                XmlTextWriter wr 
    = new XmlTextWriter(w,Encoding.GetEncoding("UTF-8"));
                xt.Transform(nav,
    null,w,null);
                w.Position 
    = 0;
                StreamReader tr 
    = new StreamReader(w);
                
    string str = tr.ReadToEnd();
                
                w.Close();
                tr.Close();
                
    return str;
            }

     

    然后定义三个重载方法,来负责转换或序列化对象生成XML:

     转换DataSet

            public static string Convert(DataSet ds) 
            
    {
                MemoryStream ms 
    = new MemoryStream();
                XmlTextWriter tw 
    = new XmlTextWriter(ms,Encoding.UTF8);
                ds.WriteXml(ms);
                
    string str = XML2JSon(ms,0);
                ds.Dispose();
                ms.Close();
                
    return str;
            }

    转换Model

    public static string Convert(object model) 
            {
                XmlSerializer xmls 
    = new XmlSerializer(model.GetType());
                MemoryStream ms 
    = new MemoryStream();
                xmls.Serialize(ms,model);
                
    string str = XML2JSon(ms,1);
                ms.Close();
                
    return str;
            }

    直接读XML并转换

    public static string Convert(string XMLFilename) 
            
    {
                FileStream fs 
    = new FileStream(XMLFilename,FileMode.Open,FileAccess.Read);
                
    string str = XML2JSon(fs,1);
                fs.Close();
                
    return str;
            }

    然后我们就可以使用它了,在ashx或webservice里调用Convert方法并用Response.write方法输出,就可以得到JSON。

    例如:

    <?xml version="1.0" encoding="utf-8" ?> 
    <root>
        
    <styletype id="0" imgsrc="/fitment/images/loading/loading.gif">读取中.......</styletype>
        
    <!--<styletype id="1" imgsrc="/fitment/images/loading/loadingbar2.gif"><![CDATA[&nbsp;]]></styletype>-->
        
    <styletype id="1"><![CDATA[读取中....<br><img src='/fitment/images/loading/loadingbar2.gif'/>]]></styletype>
    </root>

    输出成

    json = { "result": [{ "styletype": { "content""读取中......." ,id:0, imgsrc: "/fitment/images/loading/loading.gif" } } , { "styletype": { "content""读取中....
    " ,id:1 } }] }; 

    OK,这样我们就可以通过多种方式读出此JSON来处理我们的数据了

    发表于 @ 2006年12月09日 16:56:00|评论(loading...)|编辑

    新一篇: .NET下的简单AJAX处理库 | 旧一篇: 极限编程·印象

    评论

    #frank 发表于2008-01-21 22:16:45  IP: 61.144.140.*
    xlst的转换的确方便。
    试过几个js写的函数,不是parse失败就是把tagName转换小写...
    发表评论  


    登录
    Csdn Blog version 3.1a
    Copyright © 不会飞的鱼