28 September 2009

用amchart的时候遇到一个难题:将数据库里的数据生成xml (mysql5.0)sql脚本

CREATE TABLE `hostdiskinfo` (
`hdid` bigint(20) NOT NULL auto_increment,
`begintime` datetime default '0000-00-00 00:00:00',
`hdiskinfo` longtext,
`hostid` bigint(20) default '0',
PRIMARY KEY (`hdid`)
) ;

这是查询结果:

mysql> select hdiskinfo,begintime from hostdiskinfo where hostid=11
+-------------------------+---------------------+
| hdiskinfo               | begintime           |
+-------------------------+---------------------+
| C:,66.4;D:,82.8;E:,80.9 | 2009-02-06 15:15:03 |
| C:,66.4;D:,82.8;E:,80.9 | 2009-02-06 15:23:45 |
| C:,66.1;D:,82.8;E:,80.9 | 2009-02-06 15:30:02 |
| C:,64.4;D:,82.8;E:,83.8 | 2009-02-09 09:37:20 |
| C:,64.4;D:,82.8;E:,83.8 | 2009-02-09 09:39:41 |
| C:,64.4;D:,82.8;E:,83.8 | 2009-02-09 09:48:23 |
| C:,64.4;D:,82.8;E:,83.8 | 2009-02-09 09:51:14 |
+-------------------------+---------------------+
7 rows in set (0.00 sec)

现在的要求是要将以上的查询结果以下面形式写入到xml文件里面:

    <code> 
    <?xml version="1.0" encoding="UTF-8"?>
    <chart>
    <series>
        <value xid="0">02-06 15:15</value>
        <value xid="1">02-06 15:23</value>
        <value xid="2">02-06 15:30</value>
        <value xid="3">02-09 09:37</value>
        <value xid="4">02-09 09:39</value>
        <value xid="5">02-09 09:48</value>
        <value xid="6">02-09 09:51</value>
    </series>
    <graphs>
        <graph gid="1" title="C:">
            <value xid="0">66.4</value>
            <value xid="1">66.4</value>
            <value xid="2">66.1</value>
            <value xid="3">64.4</value>
            <value xid="4">64.4</value>
            <value xid="5">64.4</value>
            <value xid="6">64.4</value>
        </graph>
        <graph gid="2" title="D:">
            <value xid="0">82.8</value>
            <value xid="1">82.8</value>
            <value xid="2">82.8</value>
            <value xid="3">82.8</value>
            <value xid="4">82.8</value>
            <value xid="5">82.8</value>
            <value xid="6">82.8</value>
        </graph>
        <graph gid="3" title="E:">
            <value xid="0">80.9</value>
            <value xid="1">80.9</value>
            <value xid="2">80.9</value>
            <value xid="3">83.8</value>
            <value xid="4">83.8</value>
            <value xid="5">83.8</value>
            <value xid="6">83.8</value>
        </graph>
    </graphs>
    </chart>
    </code>

下面是我之前的实现方法:

    package org.enilu.util.amchart;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.enilu.util.db.DBConnection;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.output.Format;
    import org.jdom.output.XMLOutputter;
    
    public class AmchartDemo02 {
    
    /**
    * @param args
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    List all = getData();
    System.out.println(all.size());
    createXML(all);
    }
    
    public static List getData() {
    Connection conn = DBConnection.getConnection("conf.properties");
    List all = new ArrayList();
    ResultSet rs = null;
    Hostdiskinfo hd = null;
    PreparedStatement pstmt = null;
    String sql = "select hdiskinfo,begintime from hostdiskinfo where hostid=11";
    try {
    pstmt = conn.prepareStatement(sql);
    rs = pstmt.executeQuery();
    while (rs.next()) {
    hd = new Hostdiskinfo();
    hd.setHdiskinfo(rs.getString(1));
    hd.setBegintime(rs.getTimestamp(2));
    System.out.println(hd.getBegintime());
    all.add(hd);
    }
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } finally {
    try {
    rs.close();
    pstmt.close();
    conn.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    
    }
    return all;
    }
    
    public static boolean createXML(List all) {
    Document doc = new Document();
    Element chart, series, value, graphs, ce, de, ee, fe, ge, he = null;
    ce = new Element("graph");
    de = new Element("graph");
    ee = new Element("graph");
    fe = new Element("graph");
    ge = new Element("graph");
    he = new Element("graph");
    chart = new Element("chart");
    series = new Element("series");
    graphs = new Element("graphs");
    
    for (int i = 0; i < all.size(); i++) {
    value = new Element("value");
    value.setAttribute("xid", i + "");
    Hostdiskinfo hd = (Hostdiskinfo) all.get(i);
    value.setText(hd.getBegintime().toString().substring(5, 16));
    
    series.addContent(value);
    }
    chart.addContent(series);
    Hostdiskinfo hd2 = (Hostdiskinfo) all.get(0);
    String st = hd2.getHdiskinfo();
    if (st.contains("C:")) {
    
    ce.setAttribute("gid", "1");
    ce.setAttribute("title", "C:");
    }
    if (st.contains("D:")) {
    
    de.setAttribute("gid", "2");
    de.setAttribute("title", "D:");
    }
    if (st.contains("E:")) {
    
    ee.setAttribute("gid", "3");
    ee.setAttribute("title", "E:");
    }
    if (st.contains("F:")) {
    
    fe.setAttribute("gid", "4");
    fe.setAttribute("title", "F:");
    }
    
    if (st.contains("G:")) {
    
    ge.setAttribute("gid", "5");
    ge.setAttribute("title", "G:");
    }
    
    if (st.contains("H:")) {
    
    he.setAttribute("gid", "6");
    he.setAttribute("title", "H:");
    }
    for (int a = 0; a < all.size(); a++) {
    Hostdiskinfo hd3 = (Hostdiskinfo) all.get(a);
    String[] st1 = hd3.getHdiskinfo().split(";");
    for (int b = 0; b < st1.length; b++) {
    String[] st2 = st1[b].split(",");
    value = new Element("value");
    value.setAttribute("xid", a + "");
    
    value.setText(st2[1]);
    
    if (st2[0] == "C:" || st2[0].equals("C:")) {
    
    ce.addContent(value);
    }
    if (st2[0] == "D:" || st2[0].equals("D:")) {
    de.addContent(value);
    }
    if (st2[0] == "E:" || st2[0].equals("E:")) {
    ee.addContent(value);
    }
    if (st2[0] == "F:" || st2[0].equals("F:")) {
    fe.addContent(value);
    }
    if (st2[0] == "G:" || st2[0].equals("G:")) {
    ge.addContent(value);
    }
    if (st2[0] == "H:" || st2[0].equals("H:")) {
    he.addContent(value);
    }
    
    }
    }
    if (ce.getChildren().size() > 1) {
    graphs.addContent(ce);
    }
    if (de.getChildren().size() > 1) {
    graphs.addContent(de);
    }
    graphs.addContent(ee);
    if (fe.getChildren().size() > 1) {
    
    graphs.addContent(fe);
    }
    if (ge.getChildren().size() > 1) {
    graphs.addContent(ge);
    }
    if (he.getChildren().size() > 1) {
    graphs.addContent(he);
    }
    chart.addContent(graphs);
    doc.addContent(chart);
    Format f = Format.getRawFormat();
    f.setEncoding("UTF-8");
    f.setIndent(" ");// 每一层元素缩排两格
    XMLOutputter XMLOut = new XMLOutputter(f);
    try {
    XMLOut.output(doc, new FileOutputStream("d:/amline_data.xml"));
    return true;
    } catch (FileNotFoundException e) {
    
    e.printStackTrace();
    } catch (IOException e) {
    
    e.printStackTrace();
    }
    return false;
    }
    }

我想不到其他的实现方法,本来打算在for循环里动态new graph实例,但是我做不到,不知哪位高人路过你呢个指点下^^ 效果图如下: 后来朋友给了个更好的循环方法,贴这儿^^:

    package org.enilu.util.amchart;
    
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.enilu.util.db.DBConnection;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.output.Format;
    import org.jdom.output.XMLOutputter;
    
    public class AmchartDemo03 {
    
    
    public static void main(String[] args) {
    
    List all = getData();
    
    createXML(all);
    }
    
    /**
    * 从数据库里取得数据
    *
    * @return
    */
    public static List getData() {
    Connection conn = DBConnection.getConnection("conf.properties");
    List all = new ArrayList();
    ResultSet rs = null;
    Hostdiskinfo hd = null;
    PreparedStatement pstmt = null;
    String sql = "select hdiskinfo,begintime from hostdiskinfo where hostid=11";
    try {
    pstmt = conn.prepareStatement(sql);
    rs = pstmt.executeQuery();
    while (rs.next()) {
    hd = new Hostdiskinfo();
    hd.setHdiskinfo(rs.getString(1));
    hd.setBegintime(rs.getTimestamp(2));
    System.out.println(hd.getBegintime());
    all.add(hd);
    }
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } finally {
    try {
    rs.close();
    pstmt.close();
    conn.close();
    } catch (SQLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }
    
    }
    return all;
    }
    
    /**
    * 创建数据源文件xml
    *
    * @param all
    * @return
    */
    public static boolean createXML(List all) {
    Document doc = new Document();
    Element chart, series, value, graphs, graph = null;
    
    chart = new Element("chart");
    series = new Element("series");
    graphs = new Element("graphs");
    
    for (int i = 0; i < all.size(); i++) {
    value = new Element("value");
    value.setAttribute("xid", i + "");
    Hostdiskinfo hd = (Hostdiskinfo) all.get(i);
    value.setText(hd.getBegintime().toString().substring(5, 16));
    
    series.addContent(value);
    }
    
    Hostdiskinfo hostdiskinfo = (Hostdiskinfo) all.get(0);
    String diskinfo = hostdiskinfo.getHdiskinfo();
    
    chart.addContent(series);
    
    /* 随机取出一条数据根据是否大写判断有几个磁盘,并将磁盘名称放到集合allDriver里 */
    List allDriver = new ArrayList();
    Hostdiskinfo hd2 = (Hostdiskinfo) all.get(0);
    String st = hd2.getHdiskinfo();
    for (int i = 0; i < st.length(); i++) {
    Character c = st.charAt(i);
    if (c.isUpperCase(c)) {
    allDriver.add(c);
    System.out.println(c);
    }
    }
    int driverNum = allDriver.size();
    
    for (int m = 0; m < driverNum; m++) {
    graph = new Element("graph");
    graph.setAttribute("gid", m + "");
    graph.setAttribute("title", allDriver.get(m) + "盘");
    
    for (int n = 0; n < all.size(); n++) {
    Hostdiskinfo hd = (Hostdiskinfo) all.get(n);
    String st1[] = hd.getHdiskinfo().split(";");
    String st2[] = st1[m].split(",");
    value = new Element("value");
    value.setAttribute("xid", n + "");
    value.setText(st2[1]);
    graph.addContent(value).detach();
    }
    graphs.addContent(graph);
    }
    
    chart.addContent(graphs);
    doc.addContent(chart);
    Format f = Format.getRawFormat();
    f.setEncoding("UTF-8");
    f.setIndent(" ");// 每一层元素缩排两格
    XMLOutputter XMLOut = new XMLOutputter(f);
    try {
    XMLOut.output(doc, new FileOutputStream("d:/amline_data.xml"));
    return true;
    } catch (FileNotFoundException e) {
    
    e.printStackTrace();
    } catch (IOException e) {
    
    e.printStackTrace();
    }
    return false;
    }
    }




blog comments powered by Disqus
Fork me on GitHub