程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 用Java從XML文件中獲取業務圖表

用Java從XML文件中獲取業務圖表

編輯:關於JAVA

數據的圖解表示法是一個熱門的話題。我們翻閱雜志,可以看到很多公司提供復雜的圖形程序包,可以讓你處理你的數據並使之可視化。

這些程序包有一個公共的問題:它們要求在它們可以把你的數據形成圖表之前,你必須把你的XML數據格式化成一種它們能夠讀懂的特定的格式。 這樣的話,XML有力的靈活性就被埋沒了,因為你必須改換數據格式--通常使用XSLT。 這並不總是想看上去那麼微不足道的,因為有時開發者必須從第三方的數據源獲得XML文件,然後在把這些XML文件發送到客戶之前給它們添加圖表。 舉例來說吧,一個金融服務公司可能必須從一個租用的數據庫中取得一家公司的基本資料,然後在把它轉化成XSL格式之前需要分析這些數據。

本文將介紹如何一步一步的使用Java開發一個業務圖表服務器。服務器調用你的數據源,然後按照你設置來生成數據序列和種類的XPath變量分析數據。 它然後把數據載入制圖表引擎,一個名為JFreeChart的出色的源碼開放程序包。

最後返回到服務器的調用者的圖表是一個JPEG文件,這樣它就可以被發送到一個基於浏覽器的產品而不需要下載額外的軟件了。

在這邊文章中我開發的服務器(起名為chartserver),是一個初級版本,調用固定的XML文件作為數據源。 在本文的結尾,我將討論如何把這個服務器擴展成可以調用自己設置的參數需要的數據服務器。 另外,這個例程使用開放源碼的JFreechart引擎在服務器端構造它的圖表。 而且想要把它修改成使用任何其它的制圖表引擎的話,也是一件很簡單的事情。

圖表的元素

大部分的圖表可以分解成一系列公共的對象,其中最主要的兩個是數據系列和數據種類。 數據系列正像它名稱所蘊含的意義---一系列計劃放在一起組成一種關系的數據。 舉例來說,在一個線狀圖表中數據系列是線內的點;在一個圓餅圖中,數據系列是組成餅圖的每個表示數量的"塊"。 另一方面數據種類是描述數據系列的點。 舉例來說,在一個線狀圖中,如果數據系列是股票收盤價格,那麼通常的匹配這些數據的日期類別將是股票在這個價位收盤的日期。

本文中的例子是基於一個包含一個虛擬的球隊的賽季賽況統計數據的XML文件。在下面的例子中,球員的得分情況被制成了一張圓餅圖。 得分組成數據系列,球員姓名組成類別系列。

某些圖表需要多種數據系列,比如你想比較兩組數據的圖表,最現實的例子就是預算收入和。 實際收入,或者進行的比賽項目和取得的成績, 它然後使用這些值作為參數來構造圖表對象。

這些值連同其它的用於每個圖表的配置信息一起保存在一個charts.xml文件中。

<chart id="points">
<url>http://localhost/players.xml</url>
<config>http://localhost/pmconfig.xml</config>
<series>//Players/Player[Points>0 and Minutes>1000]/Points</series>
<categories>//Players/Player[Points>0 and Minutes>1000]/Name</categories>
<XSize>600</XSize>
<YSize>400</YSize>
</chart>

這段XML文本告訴服務器用於生成圖表的數據源儲存在什麼位置,生成圖表的配置信息儲存在什麼位置以及用於數據系列和數據種類的XPath是什麼。 我們可以看出,XPath值可以相當的復雜,在這個例子中,我們用一些條件過濾這個XML文件,找到那些球員有得分,那些球員上場時間超過1000分鐘。 他們的分數組成數據系列,他們的姓名組成類別系列。

現在,用於單獨圖表的配置文件包含設定圖表類型,圖表標題,種類標題,值標題和每個系列的標題。 這樣就能夠輕而易舉的使用數據系列被定義的顏色來表示這個系列,而不是使用某種代碼來表示了。

<chart>
<Type>1</Type>
<Title>Points By Player</Title>
<CatTitle>Player Name</CatTitle>
<ValTitle>Points</ValTitle>
<SeriesTitles>Points Scored</SeriesTitles>
</chart>

Servlet是如何工作的

代碼段1中的doGet函數取得參數值(包括圖表、寬度和高度),載入配置XML文件,分析這個文件取得正確的數據文件,然後設置所有的DoChart(見代碼段2)函數所需要的變量,而DoChart函數是執行實際的制表功能的。

配置圖表對象

配置圖表對象是一個兩步操作。 第一步是設置圖表的外觀屬性。 第二步是將這些數據裝載入圖表。

這些都是由DoChart函數來完成的。 它分析配置文件並取得一個圖表類型,然後以此構造出11個圖表中的一個。

在下面的例子中,球員的得分情況被制成了一張圓餅圖。 得分組成數據系列,球員姓名組成類別系列。

這個函數可以很容易地擴展,以便用戶增加新的設定到配置XML文件然後分析它們,這樣就可以讓用戶很有效的知道並更改制表引擎(在本例中為JFreeChart)的屬性模型,當然這一切都只要通過一個屬性文件。

現在,配置變得相當簡化了,與圖表關聯的唯一的圖表類型和各種各樣文本標題都可用了。

createDataset函數(見代碼段3)把這些數據裝載入制圖引擎。 這個函數的核心目的就是把XPath應用到XML文件中來產生一維的結點列表。 它然後使用這些結點列表來生成Vector。 這些矢量被用於構造DefaultCategoryDataset對象(請參看JFreeChart文件),制表引擎使用這些DefaultCategoryDataset對象來繪制圖表。

除了上面我介紹的圓餅圖外,我還提供了其它的兩個使用charts.xml文件構造的圖表的例子(參見圖3和4)。 你可以修改這個文件,然後用它來增添自己的圖表。

由XML引發的數據交換革命還是剛剛開始。 每天都有新的技術出現,讓我們可以用一些新鮮的並且激動人心的方法來思考我們要處理的信息。 這個圖表服務器只是正在到來的激動人心的新技術的一個簡單的例子而已。

代碼段1 doGet函數

public void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException
{
String strChart = "Points";
String strX = "0";
String strY = "0";
// 讀取參數
try
{
strChart = request.getParameter("chart").toLowerCase();
strX = request.getParameter("width");
strY = request.getParameter("height");
if(strX==null)
strX = "0";
if(strY==null)
strY = "0";
// 讀取配置文件
dfactory = DocumentBuilderFactory.newInstance();
dfactory.setNamespaceAware(true);
URLConnection con = new URL(CONFIG_LOC).openConnection();
con.connect();
InputStream newin = con.getInputStream();
xmlConfig = dfactory.newDocumentBuilder().parse(newin);
// 從配置文件中取得值
// 從XML文件中取得條目
strXPath = "/root/chart[@id='" + strChart + "']";
niNodeList = XPathAPI.selectNodeIterator(xmlConfig, strXPath);
ndeItem = niNodeList.nextNode();
elemItem = (Element) ndeItem;
// 我們然後為數據服務取得特定的參數
// 接著使用這個參數來構建一個到數據源的URL
strDataURL = GetChildItem(elemItem, "url");
strDataURL = strDataURL.replace('_','&');
// 然後從數據源中導入XML文檔
LoadDataDoc(strDataURL);
// 取得配置文件的位置
strChartConfigURL = GetChildItem(elemItem, "config");
LoadConfigDoc(strChartConfigURL);
// 然後取得用於數據系列的XPath列表
strDummy = GetChildItem(elemItem, "series");
LoadSeries(strDummy);
// 取得用於數據類別的XPath列表
strDummy = GetChildItem(elemItem, "categories");
LoadCategories(strDummy);
// 取得圖像的尺寸
// 首先檢查strX和strY參數.
// 如果沒有參數,從配置文件中讀取。
nXSize = new Integer(strX).intValue();
if (nXSize==0)
{
strDummy = GetChildItem(elemItem, "XSize");
nXSize = new Integer(strDummy).intValue();
}
nYSize = new Integer(strY).intValue();
if (nYSize==0)
{
strDummy = GetChildItem(elemItem, "YSize");
nYSize = new Integer(strDummy).intValue();
}
// 開始制圖:
DoChart();
// 輸出圖表
response.setContentType("image/jpeg");
OutputStream out = response.getOutputStream();
ChartUtilities.writeChartAsJPEG(out, chart, nXSize, nYSize);
out.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}

代碼段2 DoChart函數

private void DoChart()
{
Node nRoot;
Element nElem;
int nType;
String strTitle;
String strCatTitle;
String strValTitle;
String strSTitleList;
nRoot = xmlConfig.getDocumentElement();
nElem = (Element) nRoot;
nType = new Integer(GetChildItem(nElem,"Type")).intValue();
strTitle = GetChildItem(nElem,"Title");
strCatTitle = GetChildItem(nElem,"CatTitle");
strValTitle = GetChildItem(nElem, "ValTitle");
strSTitleList = GetChildItem(nElem, "SeriesTitles");
LoadSeriesTitles(strSTitleList);
// 取得數據並把它導入正確的數據結構
categoryData = createDataset();
// 分析圖表類型然後創建適合的圖表
switch(nType){
case 0:
{
// 垂直條狀圖
chart = ChartFactory.createVerticalBarChart
(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 1:
{
// 餅狀圖
PieDataset pieData = DatasetUtilities.createPieDataset
(categoryData, 0); chart = ChartFactory.createPieChart
(strTitle, pieData, true);
break;
}
case 2:
{
// 水平條狀圖
chart = ChartFactory.createHorizontalBarChart
(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 3:
{
// 線狀圖
chart = ChartFactory.createLineChart
(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 4:
{
// 面積圖
chart = ChartFactory.createAreaChart
(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 5:
{
// 3D水平條狀圖
chart = ChartFactory.createHorizontalBarChart3D
(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 6:
{
// 3D 餅狀圖
PieDataset pieData = DatasetUtilities.createPieDataset(categoryData, 0);
chart = ChartFactory.createPie3DChart(strTitle, pieData, true);
break;
}
case 7:
{
// 堆積水平條狀圖
chart = ChartFactory.createStackedHorizontalBarChart
(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 8:
{
// 堆積垂直條狀圖
chart = ChartFactory.createStackedVerticalBarChart
(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 9:
{
// 3D堆積垂直條狀圖
chart = ChartFactory.createStackedVerticalBarChart3D
(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 10:
{
//3D垂直條狀圖
chart = ChartFactory.createVerticalBarChart3D
(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
}
// 設置合適的顏色
setupChart();
}

代碼段3

private CategoryDataset createDataset()
{
int lp,nCurrent;
String strXPath;
String strVal;
Vector[] victor= new Vector[nDataXPathCount];
//裝載數據
try{
for(lp=0;lp<nDataXPathCount;lp++)
{
victor[lp] = new Vector();
strXPath = strDataXPaths.elementAt(lp).toString();
niNodeList = XPathAPI.selectNodeIterator(xmlData,strXPath);
elemItem = (Element) niNodeList.nextNode();
do{
if(elemItem.getFirstChild()!=null)
{
strVal = elemItem.getFirstChild().getNodeValue();
victor[lp].add(strVal);
}
elemItem = (Element) niNodeList.nextNode();
} while(elemItem!=null);
}
Double[][] nData = new Double[nDataXPathCount][victor[0].size()];
for(lp=0;lp<nDataXPathCount;lp++)
{
for(nCurrent=0;nCurrent<victor[0].size();nCurrent++)
{
try{
nData[lp][nCurrent] = new Double(victor[lp].elementAt
(nCurrent).toString());
}
catch (Exception e){
nData[lp][nCurrent] = new Double(0);
}
}
}
//裝載類別
Vector vCategories = new Vector();
strXPath = strCategoryXPaths.elementAt(0).toString();
niNodeList = XPathAPI.selectNodeIterator(xmlData,strXPath);
elemItem = (Element) niNodeList.nextNode();
for(lp=0;lp<victor[0].size();lp++)
{
strVal = elemItem.getFirstChild().getNodeValue();
vCategories.add(strVal);
elemItem = (Element) niNodeList.nextNode();
}
DefaultCategoryDataset dSet = new DefaultCategoryDataset(nData);
// 裝載系列標題
String[] strT = new String[strSTitles.size()];
for(lp=1;lp<=strSTitles.size();lp++)
{
strT[lp-1] = strSTitles.elementAt(lp-1).toString();
}
dSet.setSeriesNames(strT);
dSet.setCategories(vCategories.toArray());
return dSet;
}
catch (Exception e)
{
e.printStackTrace();
}
Double[][] nData = new Double[][]{{new Double(0)},{new Double(0)}};
return new DefaultCategoryDataset(nData);
}

代碼段4 BizCharter.java

import java.io.*;
import java.util.*;
import java.net.*;
import java.awt.Color;
import java.awt.Paint;
import java.awt.GradientPaint;
import javax.servlet.*;
import javax.servlet.http.*;
import com.jrefinery.chart.PiePlot;
import com.jrefinery.chart.JFreeChart;
import com.jrefinery.chart.ChartFactory;
import com.jrefinery.chart.ChartUtilities;
import com.jrefinery.chart.Plot;
import com.jrefinery.chart.CategoryPlot;
import com.jrefinery.chart.XYPlot;
import com.jrefinery.chart.Axis;
import com.jrefinery.chart.HorizontalCategoryAxis;
import com.jrefinery.chart.NumberAxis;
import com.jrefinery.chart.VerticalNumberAxis;
import com.jrefinery.chart.data.PlotFit;
import com.jrefinery.chart.data.LinearPlotFitAlgorithm;
import com.jrefinery.chart.data.MovingAveragePlotFitAlgorithm;
import com.jrefinery.data.CategoryDataset;
import com.jrefinery.data.DefaultCategoryDataset;
import com.jrefinery.data.PieDataset;
import com.jrefinery.data.HighLowDataset;
import com.jrefinery.data.XYDataset;
import com.jrefinery.data.DefaultXYDataset;
import com.jrefinery.data.DatasetUtilities;
import java.awt.geom.Rectangle2D;
import org.apache.xerces.parsers.DOMParser;
import org.apache.xpath.XPathAPI;
import org.apache.xml.utils.TreeWalker;
import org.apache.xml.utils.DOMBuilder;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.DocumentFragment;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.w3c.dom.traversal.NodeIterator;
import org.xml.sax.SAXException;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.DOMImplementation;
import javax.xml.transform.*;
import javax.xml.transform.stream.*;
import javax.xml.transform.dom.*;
public class BizCharter extends HttpServlet
{
private static final String CONTENT_TYPE = "image/jpeg";
private static final String DOC_TYPE;
private static final String CONFIG_LOC = "http://localhost/charts.xml";
private String version = "0.1.2";
Document xmlConfig;
Document xmlData;
Document xmlChartSetup;
Vector strDataXPaths = new Vector();
Vector strCategoryXPaths = new Vector();
Vector strSTitles = new Vector();
protected String strXPath;
private int nCategoryXPathCount=0;
private String strDataURL;
private String strChartConfigURL;
private String strService;
private NodeIterator niNodeList;
private NodeIterator niServiceList;
private Node ndeItem;
private Node ndeService;
private Element elemItem;
private Element elemService;
private String strDummy;
private DocumentBuilderFactory dfactory;
private int nXSize = 0;
private int nYSize = 0;
private CategoryDataset categoryData;
private JFreeChart chart;
private boolean bFirstTime=false;
private int nDataXPathCount=0;
public void init(ServletConfig config) throws ServletException
{
super.init(config);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
String strChart = "Points";
String strX = "0";
String strY = "0";
try
{
strChart = request.getParameter("chart").toLowerCase();
strX = request.getParameter("width");
strY = request.getParameter("height");
if(strX==null)
strX = "0";
if(strY==null)
strY = "0";
dfactory = DocumentBuilderFactory.newInstance();
dfactory.setNamespaceAware(true);
URLConnection con = new URL(CONFIG_LOC).openConnection();
con.connect();
InputStream newin = con.getInputStream();
xmlConfig = dfactory.newDocumentBuilder().parse(newin);
strXPath = "/root/chart[@id='" + strChart + "']";
niNodeList = XPathAPI.selectNodeIterator(xmlConfig, strXPath);
ndeItem = niNodeList.nextNode();
elemItem = (Element) ndeItem;
strDataURL = GetChildItem(elemItem, "url");
strDataURL = strDataURL.replace('_','&');
LoadDataDoc(strDataURL);
strChartConfigURL = GetChildItem(elemItem, "config");
LoadConfigDoc(strChartConfigURL);
strDummy = GetChildItem(elemItem, "series");
LoadSeries(strDummy);
strDummy = GetChildItem(elemItem, "categories");
LoadCategories(strDummy);
nXSize = new Integer(strX).intValue();
if (nXSize==0)
{
strDummy = GetChildItem(elemItem, "XSize");
nXSize = new Integer(strDummy).intValue();
}
nYSize = new Integer(strY).intValue();
if (nYSize==0)
{
strDummy = GetChildItem(elemItem, "YSize");
nYSize = new Integer(strDummy).intValue();
}
DoChart();
response.setContentType("image/jpeg");
OutputStream out = response.getOutputStream();
ChartUtilities.writeChartAsJPEG(out, chart, nXSize, nYSize);
out.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
private String GetChildItem(Element elemItem, String strElemName)
{
NodeList nL;
String strReturn;
nL = elemItem.getElementsByTagName(strElemName);
if(nL.getLength()>0)
{
Node ndeItem = nL.item(0);
strReturn = ndeItem. getFirstChild().getNodeValue();
}
else
{
strReturn = "null";
}
return strReturn ;
}
private void LoadDataDoc(String strDocURL)
{
try{
URLConnection urlDataConn = new URL(strDataURL).openConnection();
urlDataConn.connect();
InputStream inData = urlDataConn.getInputStream();
xmlData = dfactory.newDocumentBuilder().parse(inData);
}
catch (Exception e){
}
}
private void LoadConfigDoc(String strConfigURL)
{
try{
URLConnection urlDataConn = new URL(strConfigURL).openConnection();
urlDataConn.connect();
InputStream inData = urlDataConn.getInputStream();
xmlConfig = dfactory.newDocumentBuilder().parse(inData);
}
catch (Exception e){
}
}
private void LoadSeries(String strSeries)
{
int nCurrentLoc = 0;
int nLoc = 1;
String chToFind = ",";
String strCurrent;
strDataXPaths.clear();
nDataXPathCount = 0;
while(nLoc>0)
{
nLoc = strSeries.indexOf(chToFind,nCurrentLoc);
if(nLoc>0)
{
strCurrent = strSeries.substring(nCurrentLoc,nLoc);
strSeries = strSeries.substring(nLoc+1,strSeries.length());
}
else
{
strCurrent = strSeries;
}
strDataXPaths.add(strCurrent);
nDataXPathCount++;
}
}
private void LoadCategories(String strCategories)
{
int nCurrentLoc = 0;
int nLoc = 1;
nCategoryXPathCount = 0;
String chToFind = ",";
String strCurrent;
strCategoryXPaths.clear();
while(nLoc>0)
{
nLoc = strCategories.indexOf(chToFind,nCurrentLoc);
if(nLoc>0)
{
strCurrent = strCategories.substring(nCurrentLoc,nLoc);
strCategories = strCategories.substring(nLoc+1,strCategories.length());
}
else
{
strCurrent = strCategories;
}
strCategoryXPaths.add(strCurrent);
nCategoryXPathCount++;
}
}
private void LoadSeriesTitles(String strSeriesTitles)
{
int nCurrentLoc = 0;
int nLoc = 1;
String chToFind = ",";
String strCurrent;
strSTitles.clear();
while(nLoc>0)
{
nLoc = strSeriesTitles.indexOf(chToFind,nCurrentLoc);
if(nLoc>0)
{
strCurrent = strSeriesTitles.substring(nCurrentLoc,nLoc);
strSeriesTitles = strSeriesTitles.substring(nLoc+1,strSeriesTitles.length());
}
else
{
strCurrent = strSeriesTitles;
}
strSTitles.add(strCurrent);
}
}
private void DoChart()
{
Node nRoot;
Element nElem;
int nType;
String strTitle;
String strCatTitle;
String strValTitle;
String strSTitleList;
nRoot = xmlConfig.getDocumentElement();
nElem = (Element) nRoot;
nType = new Integer(GetChildItem(nElem,"Type")).intValue();
strTitle = GetChildItem(nElem,"Title");
strCatTitle = GetChildItem(nElem,"CatTitle");
strValTitle = GetChildItem(nElem, "ValTitle");
strSTitleList = GetChildItem(nElem, "SeriesTitles");
LoadSeriesTitles(strSTitleList);
categoryData = createDataset();
switch(nType){
case 0:
{
chart = ChartFactory.createVerticalBarChart(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 1:
{
PieDataset pieData = DatasetUtilities.createPieDataset(categoryData, 0);
chart = ChartFactory.createPieChart(strTitle, pieData, true);
break;
}
case 2:
{
chart = ChartFactory.createHorizontalBarChart(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 3:
{
chart = ChartFactory.createLineChart(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 4:
{
chart = ChartFactory.createAreaChart(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 5:
{
chart = ChartFactory.createHorizontalBarChart3D(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 6:
{
PieDataset pieData = DatasetUtilities.createPieDataset(categoryData, 0);
chart = ChartFactory.createPie3DChart(strTitle, pieData, true);
break;
}
case 7:
{
chart = ChartFactory.createStackedHorizontalBarChart(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 8:
{
chart = ChartFactory.createStackedVerticalBarChart(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 9:
{
chart = ChartFactory.createStackedVerticalBarChart3D(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
case 10:
{
chart = ChartFactory.createVerticalBarChart3D(strTitle, strCatTitle, strValTitle, categoryData, true);
break;
}
}
setupChart();
}
private void setupChart()
{
Plot theplot = chart.getPlot();
float[][] pntHSBArray = new float[4][3];
pntHSBArray[0] = Color.RGBtoHSB(57,69,148,pntHSBArray[0]);
pntHSBArray[1] = Color.RGBtoHSB(255,215,49,pntHSBArray[1]);
pntHSBArray[2] = Color.RGBtoHSB(206,207,206,pntHSBArray[2]);
pntHSBArray[3] = Color.RGBtoHSB(99,150,255,pntHSBArray[3]);
Paint[] myPaintArray = new Paint[] { Color.getHSBColor(pntHSBArray[0][0],pntHSBArray[0][1],pntHSBArray[0][2]),
Color.getHSBColor(pntHSBArray[1][0],pntHSBArray[1][1],pntHSBArray[1][2]),
Color.getHSBColor(pntHSBArray[2][0],pntHSBArray[2][1],pntHSBArray[2][2]),
Color.getHSBColor(pntHSBArray[3][0],pntHSBArray[3][1],pntHSBArray[3][2]),
};
theplot.setSeriesPaint(myPaintArray);
chart.setBackgroundPaint(Color.white);
}
private CategoryDataset createDataset()
{
int lp,nCurrent;
String strXPath;
String strVal;
Vector[] victor= new Vector[nDataXPathCount];
try{
for(lp=0;lp<nDataXPathCount;lp++)
{
victor[lp] = new Vector();
strXPath = strDataXPaths.elementAt(lp).toString();
niNodeList = XPathAPI.selectNodeIterator(xmlData,strXPath);
elemItem = (Element) niNodeList.nextNode();
do{
if(elemItem.getFirstChild()!=null)
{
strVal = elemItem.getFirstChild().getNodeValue();
victor[lp].add(strVal);
}
elemItem = (Element) niNodeList.nextNode();
} while(elemItem!=null);
}
Double[][] nData = new Double[nDataXPathCount][victor[0].size()];
for(lp=0;lp<nDataXPathCount;lp++)
{
for(nCurrent=0;nCurrent<victor[0].size();nCurrent++)
{
try{
nData[lp][nCurrent] = new Double(victor[lp].elementAt(nCurrent).toString());
}
catch (Exception e){
nData[lp][nCurrent] = new Double(0);
}
}
}
Vector vCategories = new Vector();
strXPath = strCategoryXPaths.elementAt(0).toString();
niNodeList = XPathAPI.selectNodeIterator(xmlData,strXPath);
elemItem = (Element) niNodeList.nextNode();
for(lp=0;lp<victor[0].size();lp++)
{
strVal = elemItem.getFirstChild().getNodeValue();
vCategories.add(strVal);
elemItem = (Element) niNodeList.nextNode();
}
DefaultCategoryDataset dSet = new DefaultCategoryDataset(nData);
String[] strT = new String[strSTitles.size()];
for(lp=1;lp<=strSTitles.size();lp++)
{
strT[lp-1] = strSTitles.elementAt(lp-1).toString();
}
dSet.setSeriesNames(strT);
dSet.setCategories(vCategories.toArray());
return dSet;
}
catch (Exception e)
{
e.printStackTrace();
}
Double[][] nData = new Double[][]{{new Double(0)},{new Double(0)}};
return new DefaultCategoryDataset(nData);
}
}

代碼段5 charts.xml

<?xml version="1.0"?>
<root>
  <chart id='points'>
   <url>http://localhost/players.xml</url>
   <config>http://localhost/pmconfig.xml</config>
   <series>//Players/Player[Points>0 and Minutes>1000]/Points</series>
   <categories>//Players/Player[Points>0 and Minutes>1000]/Name</categories>
   <XSize>600</XSize>
   <YSize>400</YSize>
  </chart>
  <chart id='defenders'>
   <url>http://localhost/players.xml</url>
   <config>http://localhost/dfconfig.xml</config>
   <series>//Players/Player[Position='DEF' or Position='DEF-MID']/Points</series>
   <categories>//Players/Player[Position='DEF' or Position='DEF-MID']/Name</categories>
   <XSize>600</XSize>
   <YSize>400</YSize>
  </chart>
  <chart id='makeup'>
   <url>http://localhost/players.xml</url>
   <config>http://localhost/muconfig.xml</config>
   <series>//Players/Player/Goals,//Players/Player/Points</series>
   <categories>//Players/Player/Number</categories>
   <XSize>600</XSize>
   <YSize>400</YSize>
  </chart>
</root>

代碼段6 dfconfig.xml

<?xml version="1.0"?>
<chart>
  <Type>10</Type>
  <Title>Points By Defender</Title>
  <CatTitle>Player Name</CatTitle>
  <ValTitle>Points</ValTitle>
  <SeriesTitles>Points Scored</SeriesTitles>
</chart>

代碼段7 muconfig.xml

<?xml version="1.0"?>
<chart>
  <Type>9</Type>
  <Title>Points Breakdown</Title>
  <CatTitle>Player Number</CatTitle>
  <ValTitle>Points</ValTitle>
  <SeriesTitles>Goals, Assists</SeriesTitles>
</chart>

代碼段8 players.xml

<Players team="New York Power">
  <Player>
   <Number>30</Number>
   <Position>MID</Position>
   <Name>Justi Baumgardt-Yamada</Name>
   <GamesPlayed>5</GamesPlayed>
   <GamesStarted>2</GamesStarted>
   <Minutes>233</Minutes>
   <Goals>0</Goals>
   <Assists>1</Assists>
   <Points>1</Points>
   <Shots>6</Shots>
   <ShotsOnGoal>2</ShotsOnGoal>
   <Blocks>0</Blocks>
   <FoulsCommitted>2</FoulsCommitted>
   <FoulsSuffered>5</FoulsSuffered>
   <Cautions>0</Cautions>
   <Ejections>0</Ejections>
  </Player>
  <Player>
   <Number>12</Number>
   <Position>MID</Position>
   <Name>Kirsta Davey</Name>
   <GamesPlayed>15</GamesPlayed>
   <GamesStarted>1</GamesStarted>
   <Minutes>357</Minutes>
   <Goals>2</Goals>
   <Assists>0</Assists>
   <Points>4</Points>
   <Shots>8</Shots>
   <ShotsOnGoal>5</ShotsOnGoal>
   <Blocks>0</Blocks>
   <FoulsCommitted>6</FoulsCommitted>
   <FoulsSuffered>7</FoulsSuffered>
   <Cautions>1</Cautions>
   <Ejections>0</Ejections>
  </Player>

代碼段 9 pmconfig.xml

<?xml version="1.0"?>
<chart>
  <Type>1</Type>
  <Title>Points By Player</Title>
  <CatTitle>Player Name</CatTitle>
  <ValTitle>Points</ValTitle>
  <SeriesTitles>Points Scored</SeriesTitles>
</chart>

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved