在前面的例子里,我們使用的數據都是一個單獨的XML文件,它可以被很多需要它的文件來調用。但是有的時候,我們可能不需要單獨的文件,這時,我們就可以使用dataXML 方法來進行數據的調用。
使用dataXML提供數據
dataXML 和dataURL都可以提供數據,dataURL是以把XML文件地址以URL的形式告訴FCF,如一個靜態的文件Data.xml,或者是一個動態的文件,如mydata.jsp(頁面返回XML格式的文本)。dataXML則是以XML文本的形式告訴FCF。可能有點不好理解,看看下面的代碼就知道了。
<html>
<body bgcolor="#ffffff">
<OBJECT classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0" width="600" height="500" id="Column3D" >
<param name="movie" value="../FusionCharts/FCF_Column3D.swf?chartWidth=600&chartHeight=500" />
<param name="FlashVars" value="&dataXML=<graph caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showNames='1' decimalPrecision='0' formatNumberScale='0'><set name='Jan' value='462' color='AFD8F8' /><set name='Feb' value='857' color='F6BD0F' /><set name='Mar' value='671' color='8BBA00' /><set name='Apr' value='494' color='FF8E46'/><set name='May' value='761' color='008E8E'/><set name='Jun' value='960' color='D64646'/><set name='Jul' value='629' color='8E468E'/><set name='Aug' value='622' color='588526'/><set name='Sep' value='376' color='B3AA00'/><set name='Oct' value='494' color='008ED6'/><set name='Nov' value='761' color='9D080D'/><set name='Dec' value='960' color='A186BE'/></graph>">
<param name="quality" value="high" />
<embed src="../FusionCharts/FCF_Column3D.swf?chartWidth=600&chartHeight=500" flashVars="&dataXML=<graph caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showNames='1' decimalPrecision='0' formatNumberScale='0'><set name='Jan' value='462' color='AFD8F8' /><set name='Feb' value='857' color='F6BD0F' /><set name='Mar' value='671' color='8BBA00' /><set name='Apr' value='494' color='FF8E46'/><set name='May' value='761' color='008E8E'/><set name='Jun' value='960' color='D64646'/><set name='Jul' value='629' color='8E468E'/><set name='Aug' value='622' color='588526'/><set name='Sep' value='376' color='B3AA00'/><set name='Oct' value='494' color='008ED6'/><set name='Nov' value='761' color='9D080D'/><set name='Dec' value='960' color='A186BE'/></graph>" quality="high" width="600" height="500" name="Column3D" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" />
</object>
</body>
</html>

我們把上面的代碼保存到一個叫ChartDataXML.html的文件里。
可以看到,FlashVars 的值是這樣的一種形式:
<PARAM NAME="FlashVars" Value="&dataXML=completeXMLData">
在EMBED 標記里,是這樣的:
<EMBED ... FlashVars="&dataXML=completeXMLData">
而原來我們放到FlashVars的兩個參數--chartWidth,chartHeight,則被放到了SWF文件地址的后面。
使用JavaScript和dataXML
看下面的代碼。
<html>
<head>
<script language="JavaScript" src="../FusionCharts/FusionCharts.js"></script>
</head>
<body bgcolor="#ffffff">
<div id="chartdiv" align="center">The chart will appear within this DIV. This text will be replaced by the chart.</div>

<script type="text/javascript">
var myChart = new FusionCharts("../FusionCharts/FCF_Column3D.swf", "myChartId", "600", "500");
myChart.setDataXML("<graph caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showNames='1' decimalPrecision='0' formatNumberScale='0'><set name='Jan' value='462' color='AFD8F8' /><set name='Feb' value='857' color='F6BD0F' /><set name='Mar' value='671' color='8BBA00' /><set name='Apr' value='494' color='FF8E46'/><set name='May' value='761' color='008E8E'/><set name='Jun' value='960' color='D64646'/><set name='Jul' value='629' color='8E468E'/><set name='Aug' value='622' color='588526'/><set name='Sep' value='376' color='B3AA00'/><set name='Oct' value='494' color='008ED6'/><set name='Nov' value='761' color='9D080D'/><set name='Dec' value='960' color='A186BE'/></graph>");
myChart.render("chartdiv");
</script>
</body>
</html>

原來我們調用的是setDataURL()方法,而現在是setDataXML()方法,它的參數則是一個完整的XML字符串。
不管我們使用什么方法,我們都能得到一樣的結果。
setDataXML()方法的問題
我們知道,在使用GET方法得到參數時,瀏覽器對參數值的長度是有一定的限制的,所以,如果XML字符過長,可能會產生問題。這時我們就需要使用setDataURL()方法。
如果你的XML字符里含有雙字節字符,例如中文字符,你就不能使用setDataXML()方法,你應該使用setDataURL()方法。
最佳模式
在我們的實際應用里,數據不可能是靜態的,它可能是有用戶選擇查詢條件,然后提交給服務器,服務器返回一個查詢的結果,比如search.jsp?year=2008。所以我給大家推薦的最佳模式是使用setDataURL()方法,并且使用JavaScript來加載圖形。
在使用setDataURL()方法時,如果地址里含有“?”、“&”等字符,你就需要對這個地址進行URL編碼。在JavaScript里進行編碼,使用escape(url)這個函數。如果你想在服務器端就進行編碼,那就使用你的編程語言提供的URL編碼方法。在java里進行編碼的函數是java.net.URLEncoder.encode()。
本文原始地址:http://ajava.org/hot/fusioncharts/872.html