2014-01-15 77 views
0

以下AS#RSS閱讀器代碼會從RSS項目中拉取標題,但似乎也包含XML標記。如何在不使用正則表達式或字符串替換的情況下包含XML標記?ActionScript RSS標題問題

import flash.text.TextField; 
import flash.text.TextFormat; 
import flash.net.URLLoader; 
import flash.events.IOErrorEvent; 


//Read RSS feeds 
var RSS_xmlData: XML = new XML(); 
var xmlLoader: URLLoader = new URLLoader(); 
xmlLoader.addEventListener(Event.COMPLETE, LoadXML); 

xmlLoader.load(new URLRequest("http://www.oshawa.ca/news_rss.asp")); 

function LoadXML(e:Event):void { 
    dtext.text="Loading..."; 
    RSS_xmlData = new XML(e.target.data); 
    pullFeed(RSS_xmlData); 

} 

function pullFeed(rss: XML):void {  
    var str: String=""; 
    str = rss.channel.item.title; 
    str = str.replace(/\s*\n/g," | "); 
    //str = str.replace(/'/g,"\""); 

    //// shows specific entry 
    var items: Array = new Array(); 
    items = str.split("|"); 

    var tf: TextField = dtext; 
    var i:Number=0; 
    var myTimer:Timer = new Timer(4000,1000); 
    myTimer.addEventListener(TimerEvent.TIMER, timerListener); 
    function timerListener (e:TimerEvent):void{ 
     tf.text = items[i].toString(); 
     scaleTextToFitInTextField(tf); 
     i = i < items.length - 1 ? i + 1 : 0; 
    } 
    myTimer.start(); 
} 

function scaleTextToFitInTextField(txt: TextField):void { 
    var f: TextFormat = txt.getTextFormat(); 
    f.size = (txt.width > txt.height) ? txt.width : txt.height; 
    txt.setTextFormat(f); 

    while (txt.textWidth > txt.width - 4 || txt.textHeight > txt.height - 6) { 
     f.size = int(f.size) - 1; 
     txt.setTextFormat(f); 
    } 
} 


function onIOError(e:IOErrorEvent):void 
{ 
    trace(e.toString()); 
    dtext.text="Finding Feed..."; 
} 

感謝您的任何幫助。

回答

1

您在那裏獲取XML標記的原因是因爲rss.channel.item.title返回的值爲XMLList,對應於與該選擇匹配的所有<title>節點 - 而不僅僅是這些節點的文本內容。正如您所指出的那樣,將它轉換爲String然後手動去除無關標記是相當落後的。

我會遍歷所有<item>節點,並隨着您的需要將它們的<title>內容添加到數組中。然後,新pullFeed方法會是什麼樣子:

function pullFeed(rss: XML):void {  
    var items:Array = new Array();     //Declare Array of titles 
    var numItems:int = rss.channel.item.length(); //Capture number of <item> nodes 

    for (var i:int = 0; i < numItems; i++) { 
     items.push(String(rss.channel.item[i].title)); //Add each <item>'s <title> to the Array 
    } 

    var tf: TextField = dtext; 
    var i:Number=0; 
    var myTimer:Timer = new Timer(4000,1000); 
    myTimer.addEventListener(TimerEvent.TIMER, timerListener); 
    function timerListener (e:TimerEvent):void{ 
     tf.text = items[i]; 
     scaleTextToFitInTextField(tf); 
     i = i < items.length - 1 ? i + 1 : 0; 
    } 
    myTimer.start(); 
} 

通過XML節點這樣迭代的另外一個好處是,你可以很容易地通過XML捕獲每個<item>的在同一關口的<description><pubDate>內容,如果你計劃在以後使用它。