用Java从XML文件中获取业务图表
当前位置:以往代写 > JAVA 教程 >用Java从XML文件中获取业务图表
2019-06-14

用Java从XML文件中获取业务图表

用Java从XML文件中获取业务图表

副标题#e#

数据的图解暗示法是一个热门的话题。我们翻阅杂志,可以看到许多公司提供巨大的图形措施包,可以让你处理惩罚你的数据并使之可视化。

这些措施包有一个民众的问题:它们要求在它们可以把你的数据形成图表之前,你必需把你的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>


#p#副标题#e#

Servlet是如何事情的

代码段1中的doGet函数取得参数值(包罗图表、宽度和高度),载入设置XML文件,阐明这个文件取得正确的数据文件,然后配置所有的DoChart(见代码段2)函数所需要的变量,而DoChart函数是执行实际的制表成果的。

设置图表工具

设置图表工具是一个两步操纵。 第一步是配置图表的外观属性。 第二步是将这些数据装载入图表。

这些都是由DoChart函数来完成的。 它阐明设置文件并取得一个图表范例,然后以此结构出11个图表中的一个。

在下面的例子中,球员的得分环境被制成了一张圆饼图。 得分构成数据系列,球员姓名构成种别系列。

#p#分页标题#e#

这个函数可以很容易地扩展,以便用户增加新的设定到设置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();
}
}

#p#副标题#e#

代码段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();
}

#p#副标题#e#

代码段3

#p#分页标题#e#

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);
}

#p#副标题#e#

代码段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);
}
}

#p#副标题#e#

代码段5 charts.xml

#p#分页标题#e#

<?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

#p#分页标题#e#

<?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

#p#分页标题#e#

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

#p#副标题#e#

代码段8 players.xml

#p#分页标题#e#

<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>

    关键字:

在线提交作业