情况是这样的,用FusionCharts 做一些统计图,
实现方式有两种,setDataURL 和 setDataXML 
用setDataURL可以实现统计图,但问题是不能显示中文,不光是Y轴不能显示,
就连标题和X轴出现中文的时候也报错,提示非法数据;网上的朋友说把setDataURL 
改成setDataXML 实现就能使用中文,现在问题来了:
public class Java2XML_CN {
public Document createDoc(){
// 创建根节点 chart;    
Element root = new Element("chart");
root.setAttribute("caption", "Monthly Unit Sales");
root.setAttribute("xAxisName", "Month");
root.setAttribute("yAxisName", "Units");
root.setAttribute("showValues", "1");
root.setAttribute("decimals", "0");
root.setAttribute("formatNumberScale", "0"); // 根节点添加到文档中;    
Document Doc = new Document(root); String[] lable = { "Jan", "Fab", "Mar", "Apr", "May", "Jun", "Jul",
"Agu", "Sep", "Otp", "Nov", "Dec" }; String[] value = { "345", "123", "634", "811", "234", "897", "975",
"332", "188", "223", "678", "346" }; // 此处 for 循环可替换成 遍历 数据库表的结果集操作;    
for (int i = 0; i < lable.length; i++) {
// 创建节点 set;    
Element elements = new Element("set"); // 给 set节点添加属性 id;    
elements.setAttribute("label", lable[i]);
elements.setAttribute("value", value[i]); // 给父节点chart添加set子节点;   
root.addContent(elements);
}
return Doc;
}
//把jdom的document转换成string
public String XmlDocumentToString() throws IOException{
Document doc = createDoc();
Format format = Format.getPrettyFormat();
format.setEncoding("UTF-8");//设置xml文件的字符为gb2312,解决中文问题
XMLOutputter xmlout = new XMLOutputter(format);
ByteArrayOutputStream bo = new ByteArrayOutputStream();
xmlout.output(doc,bo);
String xmlStr = bo.toString().replaceAll("\"", "'");
        return xmlStr;
    }
}这个在jsp页面调用的时候 确实能返回一个String形式的xml数据:
<?xml version='1.0' encoding='UTF-8'?>
<chart caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showValues='1' decimals='0' formatNumberScale='0'>
  <set label='Jan' value='345' />
  <set label='Fab' value='123' />
  <set label='Mar' value='634' />
  <set label='Apr' value='811' />
  <set label='May' value='234' />
  <set label='Jun' value='897' />
  <set label='Jul' value='975' />
  <set label='Agu' value='332' />
  <set label='Sep' value='188' />
  <set label='Otp' value='223' />
  <set label='Nov' value='678' />
  <set label='Dec' value='346' />
</chart>但问题是在jsp页面显示的时候出问题:
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="com.test.*;"%><%
String path = request.getContextPath();
String basePath = request.getScheme() + "://"
+ request.getServerName() + ":" + request.getServerPort()
+ path + "/";

Java2XML_CN jc = new Java2XML_CN();
String xmlData = (String)jc.XmlDocumentToString();
System.out.print(xmlData);

%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>"> <title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
<link rel="stylesheet" href="FusionCharts/Contents/Style.css"
type="text/css" />
<script language="JavaScript"
src="FusionCharts/JSClass/FusionCharts.js"></script>
<script type="text/javascript">
function check(){
var chart = new FusionCharts("FusionCharts/Charts/Column2D.swf", "ChartId", "500", "300", "0", "0");
    chart.setDataXML("<%=xmlData %>");
    chart.render("chartdiv");
}   
</script>
</head> <body>
<center>
<a href="javascript:check();">生成测试统计图(中文)!</a>
<br>
<div id="chartdiv"></div>
</center>
</body>
</html>
//红色部分出问题,总是提示未结束的什么东西,应该就是字符串的问题,想请教大家有什么好的解决办法没???谢谢!

解决方案 »

  1.   

    构建XML的时候对attribute的value部分 对< > &等特殊字符进行转换以后 在将value用URLEncoder.encode(value)一下 应该就没问题了
      

  2.   

    最好还是用这个  setDataURL 性能好点
    好像有例外一种方法可以支持中文但是我开始用的时候没有用过 
      

  3.   

    可不可以详细点?谢谢!方便加Q指导下么?251637313
    对< > &amp;等特殊字符进行转换以后 是不是还要转换回来啊?
      

  4.   

    可不可以详细点?谢谢!方便加Q指导下么?251637313
    对< > &amp;等特殊字符进行转换以后 是不是还要转换回来啊?
      

  5.   

    可不可以详细点?谢谢!方便加Q指导下么?251637313
    对< > &amp;等特殊字符进行转换以后 是不是还要转换回来啊?
      

  6.   

    我用的是myChart.setDataXML();
    rootChart.setDataXML("<%=request.getAttribute("xml") %>"); 我是设置在request中的;
    我不知道你得到字符串的方法是怎么来的。那个方法我没用过。你可以试试把字符串设置到request中。
    直接用document对象也行。
      

  7.   

    伙计,我这不能上QQ,你那不是用document得到了xml对象了么.
    直接request.Attribute("doc",doc);
    然后再在页面rootChart.setDataXML("<%=request.getAttribute("doc") %>"); 就可以了
      

  8.   

    嗯,是这么做的,但是还是提示 未结束的字符串常量  这个是源代码
    <script type="text/javascript">
    function check(){
    var chart = new FusionCharts("FusionCharts/Charts/Column2D.swf", "ChartId", "500", "300", "0", "0");
        chart.setDataXML("<?xml version='1.0' encoding='UTF-8'?>
    <chart caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showValues='1' decimals='0' formatNumberScale='0'>
      <set label='Jan' value='345' />
      <set label='Fab' value='123' />
      <set label='Mar' value='634' />
      <set label='Apr' value='811' />
      <set label='May' value='234' />
      <set label='Jun' value='897' />
      <set label='Jul' value='975' />
      <set label='Agu' value='332' />
      <set label='Sep' value='188' />
      <set label='Otp' value='223' />
      <set label='Nov' value='678' />
      <set label='Dec' value='346' />
    </chart>
     
    ");
        chart.render("chartdiv");
    }   
    </script>
      

  9.   

    这个你输出来自己拼的xml看一下,如果完全符合事例。肯定没问题啊祝楼主好运
      

  10.   

    这个是我修改过的测试html的代码
    <html>
    <head>
    <script language="JavaScript" src="FusionCharts.js"></script>
    </head>
    <body bgcolor="#ffffff">
    <!-- Start Code for FusionCharts chart -->
    <div id="chartdiv" align="center">FusionCharts</div>
    <script type="text/javascript">
     var myChart = new FusionCharts("Column2D.swf", "FusionCharts_1", "450", "300", "0", "0");
     myChart.setDataXML("<chart caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showValues='1' decimals='0' formatNumberScale='0'><set label='Jan' value='345' /><set label='Fab' value='123' /><set label='Mar' value='634' /><set label='Apr' value='811' /><set label='May' value='234' /><set label='Jun' value='897' /><set label='Jul' value='975' /><set label='Agu' value='332' /><set label='Sep' value='188' /><set label='Otp' value='223' /><set label='Nov' value='678' /><set label='Dec' value='346' /></chart>");
     myChart.render("chartdiv");
    </script>
    <!-- End Code for FusionCharts chart -->
    </body>
    </html>
    下面这个是我copy你xml对象中的fusioncharts代码
    <html>
    <head>
    <script language="JavaScript" src="FusionCharts.js"></script>
    </head>
    <body bgcolor="#ffffff">
    <!-- Start Code for FusionCharts chart -->
    <div id="chartdiv" align="center">FusionCharts</div>
    <script type="text/javascript">
     var myChart = new FusionCharts("Column2D.swf", "FusionCharts_1", "450", "300", "0", "0");
     myChart.setDataXML("<?xml version='1.0' encoding='UTF-8'?>
    <chart caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showValues='1' decimals='0' formatNumberScale='0'>
      <set label='Jan' value='345' />
      <set label='Fab' value='123' />
      <set label='Mar' value='634' />
      <set label='Apr' value='811' />
      <set label='May' value='234' />
      <set label='Jun' value='897' />
      <set label='Jul' value='975' />
      <set label='Agu' value='332' />
      <set label='Sep' value='188' />
      <set label='Otp' value='223' />
      <set label='Nov' value='678' />
      <set label='Dec' value='346' />
    </chart>");
     myChart.render("chartdiv");
    </script>
    <!-- End Code for FusionCharts chart -->
    </body>
    </html>得出的结论是,你把空格去掉就可以了.所以.....
      

  11.   

    你说的去掉空格 我去掉了 但是还是一样提示 未结束的字符串常量 下面是页面源代码
    <script type="text/javascript">
    function check(){
    var chart = new FusionCharts("FusionCharts/Charts/Column2D.swf", "ChartId", "500", "300", "0", "0");
        chart.setDataXML("<?xml version='1.0' encoding='UTF-8'?>
    <chart caption='Monthly Unit Sales' xAxisName='Month' yAxisName='Units' showValues='1' decimals='0' formatNumberScale='0'>
      <set label='Jan' value='345' />
      <set label='Fab' value='123' />
      <set label='Mar' value='634' />
      <set label='Apr' value='811' />
      <set label='May' value='234' />
      <set label='Jun' value='897' />
      <set label='Jul' value='975' />
      <set label='Agu' value='332' />
      <set label='Sep' value='188' />
      <set label='Otp' value='223' />
      <set label='Nov' value='678' />
      <set label='Dec' value='346' />
    </chart>");
        chart.render("chartdiv");
    }   
    </script>
      

  12.   

    你那个是没有去掉空格的.你用editplus这个工具打开我修改过的html页面
    然后把你说的去掉空格的那个字符串复制进去,然后把所有的那段字符串弄成一行就会出来了.
      

  13.   

    嗯 我晓得你的意思了,问题是我用string的trim()方法去掉头尾空格的时候 那个换行去不掉呢?
      

  14.   

    你把打印在后台的xml发出来看看.
      

  15.   

    解决了 谢谢你的提醒 其实就是空格和换行导致的
    xmlStr= xmlStr.trim().replaceAll("  <", "<").replaceAll("\"", "'").replaceAll.(System.getProperty("line.separator"),"");这句话解决了....