• About Me
  • Java基礎教學
  • 部落格聯播

[Java]SiteMap Creater-簡單的SiteMap建立程式

分類: database, google, Java, yahoo, 教學, 程式 時間:2010/6/22 瀏覽:627 瀏覽數 — 更多回應

SiteMapCreater主要的功能在自動產生SiteMap.xml,只需要在資料庫表格裡建立所要產生的SiteMap網址等資訊就可以執行它來自動產生需要的SiteMap而提交給Google或yahoo等搜尋引擎。

這個程式主要是獨立作業的,可以利用windows或是linux的排程來執行jar run就可以了,這樣子可以減少對伺服器的負擔。

程式的作法是從資料庫取得資料,再把資料加上xml需要的字串,然後最後輸出成檔案就可以了,中間有些需要注意的地方,像是筆數不可太多,此程式設定4000筆會換一個檔案名稱,還有檔案也不可超過太大,8mb以下或更小。

執行後會得到以下檔案,一個index的Sitemap.xml及實際的內容的Info0.xml,另外還需要一個xsl來當讀取樣版的準則,向搜尋引擎只需要提交Sitemap.xml這個檔案就可以了,程式還會自動把所有檔案變成一個zip檔,google可以提交zip檔案做為SiteMap,不過此部份並未成功,有興趣的朋友可以再加以改進。

SiteMap1.png


主要產生xml程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
package yku.xml;
 
public class SiteMapCreator {
    private org.apache.log4j.Logger logger;
 
    private java.text.DateFormat dformat;
 
    private String directory;// 存放SiteMap xml 路徑
 
    private String Url_Directory;// SiteMap url路徑
 
    private String ZipToFile;// 做成Zip的目錄及名稱
 
    private java.util.ArrayList SiteMapList;
 
    private String Header;
 
    private String End;
 
    public SiteMapCreator() {
        logger = org.apache.log4j.Logger.getLogger(this.getClass());
        dformat = new java.text.SimpleDateFormat("yyyy-MM-dd HH:mm");
        SiteMapList = new java.util.ArrayList();
        directory = yku.setup.P.getV("Directory");
        Url_Directory = yku.setup.P.getV("Url_Directory");
        ZipToFile = yku.setup.P.getV("ZipToFile");
        Header = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
                + "<?xml-stylesheet type=\"text/xsl\" href=\"wa_google.xsl\"?>"
                + "<urlset xmlns:xsi=\"http://www.w3.org/2001/XMLSchema"
                + "-instance\" xsi:schemaLocation=\"http://www.sitemaps."
                + "org/schemas/sitemap/0.9 http://www.sitemaps.org/schemas"
                + "/sitemap/0.9/sitemap.xsd\" xmlns=\"http://www.sitemaps."
                + "org/schemas/sitemap/0.9\">";
 
        End = "</urlset>";
        java.io.File f = new java.io.File(directory);
        if (!f.exists())
            f.mkdir();
 
        // 建立xsl,如果xsl存在copy一份過去
        f = new java.io.File(f.getAbsoluteFile() + "/wa_google.xsl");
 
        if (!f.exists()) {
            java.io.File xsl = new java.io.File("wa_google.xsl");
            copyfile(xsl, f);
 
        }
    }
 
    public void run() {
        MakeSiteMap();
        outIndex();
        zip();
    }
 
    private String XmlElement(String url, String time, String changefreq,
            double priority) {
        return "<url><loc>" + url + "</loc><lastmod>" + time
                + "</lastmod><changefreq>" + changefreq
                + "</changefreq><priority>" + priority + "</priority></url>";
    }
 
    private void MakeSiteMap() {
        int count = 0;// 計算輸出了幾筆
        String sql = "select * from sitemapinfo";
        java.sql.ResultSet rs = null;
        java.sql.Statement stat = null;
        java.sql.Connection con = null;
 
        java.io.PrintWriter fw = null;
        try {
            con = yku.database.Manager.getConnection();
            stat = con.createStatement();
            rs = stat.executeQuery(sql);
            while (rs.next()) {
                if (count % 40000 == 0) {
                    if (fw != null) {
                        fw.println(End);
                        fw.flush();
                        fw.close();
                        fw = null;
                    }
                    // SiteMap的檔案名稱
                    logger.info("File Name:" + directory + "Info"
                            + (count / 40000) + ".xml");
                    java.io.File f = new java.io.File(directory + "Info"
                            + (count / 40000) + ".xml");
                    SiteMapList.add("Info" + (count / 40000) + ".xml");
 
                    fw = new java.io.PrintWriter(f, "UTF-8");
                    fw.println(Header);
                }
                try {
                    java.sql.Timestamp time = rs.getTimestamp("time");
                    fw.write(XmlElement(Url_Directory + rs.getString("url"),
                            dformat.format(time), rs.getString("freq"), rs
                                    .getDouble("priority")));
                    count++;
                } catch (java.sql.SQLException e) {
                    e.printStackTrace();
                    logger.info("MakeSiteMap:" + "處理錯誤:" + e);
                }
            }
            fw.println(End);
            fw.flush();
            fw.close();
 
        } catch (java.sql.SQLException e) {
            e.printStackTrace();
            logger.info("MakeSiteMap:" + e);
        } catch (java.io.IOException e) {
            e.printStackTrace();
            logger.info("MakeSiteMap:" + e);
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                    rs = null;
                }
                if (stat != null) {
                    stat.close();
                    stat = null;
                }
            } catch (java.sql.SQLException ex) {
                ex.printStackTrace();
                logger.info("MakeSiteMap:" + ex);
            }
            try {
                if (con != null) {
                    con.close();
                    con = null;
                }
            } catch (java.sql.SQLException e) {
                e.printStackTrace();
                logger.info("MakeSiteMap:" + e);
            }
        }
 
    }
 
    private void outIndex() {
        java.io.PrintWriter fw = null;
        try {
            java.io.File f = new java.io.File(directory + "Sitemap.xml");
            fw = new java.io.PrintWriter(f, "UTF-8");
            fw
                    .println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n"
                            + "<sitemapindex xmlns:xsi=\"http://www.w3.org/2001/"
                            + "XMLSchema-instance\" xsi:schemaLocation=\"http:"
                            + "//www.sitemaps.org/schemas/sitemap/0.9 http://www"
                            + ".sitemaps.org/schemas/sitemap/0.9/sitemap.xsd\" "
                            + "xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"> ");
            for (int i = 0; i < this.SiteMapList.size(); i++) {
                fw
                        .println("<sitemap><loc>"
                                + Url_Directory
                                + SiteMapList.get(i)
                                + "</loc><lastmod>"
                                + dformat.format(new java.util.Date(System
                                        .currentTimeMillis()))
                                + "</lastmod></sitemap>");
                fw.flush();
            }
            fw.println("</sitemapindex>");
            fw.flush();
            // this.SiteMapList.add("Sitemap.xml");
        } catch (java.io.IOException e) {
            e.printStackTrace();
            logger.info("outIndex:" + e);
        } finally {
            if (fw != null) {
                try {
                    fw.close();
                } catch (Exception e) {
                    e.printStackTrace();
                    logger.info("outIndex:" + e);
                }
                fw = null;
            }
 
        }
    }
 
    // 壓縮成zip檔
    private void zip() {
 
        java.io.File outFile = new java.io.File(this.ZipToFile);
        java.util.zip.ZipOutputStream zo = null;
        java.io.BufferedOutputStream bs = null;
        java.io.FileOutputStream fos = null;
        java.io.FileInputStream fis = null;
        try {
            fos = new java.io.FileOutputStream(outFile);
            bs = new java.io.BufferedOutputStream(fos);
            zo = new java.util.zip.ZipOutputStream(bs);
            byte[] buf = new byte[1024];
            int len;
            // System.out.println("baseFile: "+baseFile.getPath());
            for (int i = 0; i < this.SiteMapList.size(); i++) {
                fis = new java.io.FileInputStream(this.directory
                        + this.SiteMapList.get(i));
                // 建立檔案名稱
                zo.putNextEntry(new java.util.zip.ZipEntry(
                        (String) this.SiteMapList.get(i)));
                while ((len = fis.read(buf)) > 0) {
                    zo.write(buf, 0, len);
                }
                fis.close();
            }
        } catch (java.io.IOException e) {
            logger.info("Zip Error:" + e);
        } finally {
            try {
                if (zo != null) {
                    zo.close();
                    zo = null;
                }
                if (bs != null) {
                    bs.close();
                    bs = null;
                }
 
                if (fis != null) {
 
                    fis.close();
 
                    fis = null;
                }
                if (fos != null) {
                    fos.close();
                    fos = null;
                }
 
            } catch (java.io.IOException e) {
 
            }
        }
    }
 
    private void copyfile(java.io.File f1, java.io.File f2) {
        try {
 
            java.io.InputStream in = new java.io.FileInputStream(f1);
 
            // For Append the file.
            // OutputStream out = new FileOutputStream(f2,true);
 
            // For Overwrite the file.
            java.io.OutputStream out = new java.io.FileOutputStream(f2);
 
            byte[] buf = new byte[1024];
            int len;
            while ((len = in.read(buf)) > 0) {
                out.write(buf, 0, len);
            }
            in.close();
            out.close();
            logger.info("XLS File copied.");
        } catch (java.io.FileNotFoundException ex) {
            logger.info(ex.getMessage() + " in the specified directory.");
            System.exit(0);
        } catch (java.io.IOException e) {
            logger.info(e.getMessage());
        }
    }
 
    public static void main(String args[]) {
        (new SiteMapCreator()).run();
    }
}

連結資料庫程式碼

利用讀取外部設定檔來取得mysql ConnectionPool,再向此Pool取得java.sql.Connection

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package yku.database;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
 
import javax.sql.DataSource;
 
public class Manager {
    public static com.mysql.jdbc.jdbc2.optional.MysqlDataSource ds = null;
 
    public static DataSource getPool() {
        // com.mysql.jdbc.jdbc2.optional. ds = null;
 
        if (properties == null)
            loadJDBCProperties();
        // ds = new oracle.jdbc.pool.OracleConnectionPoolDataSource ();
        if (ds == null) {
            ds = new com.mysql.jdbc.jdbc2.optional.MysqlDataSource();
 
            // 傳入參數
            ds.setServerName(properties.getProperty("ServerName"));
            ds.setPortNumber(Integer.parseInt(properties.getProperty("port")));
            ds.setDatabaseName(properties.getProperty("DatabaseName"));
            ds.setUser(properties.getProperty("user"));
            ds.setPassword(properties.getProperty("password"));
        }
 
        return ds;
    }
 
    public static java.sql.Connection getConnection()
            throws java.sql.SQLException {
        return getPool().getConnection();
    }
 
    private static java.util.Properties properties = null;
 
    private static void loadJDBCProperties() {
        // create JDBC.properties file handle
        File file = new File("jdbc.properties");
        file = new File(file.getAbsolutePath()); // for Windows bug
 
        yku.log.out.println("ConnectionManager:load JDBC properties: "
                + file.getAbsolutePath());
 
        try {
            FileInputStream input = null;
            try {
                input = new FileInputStream(file);
                properties = new Properties();
                properties.load(input);
            } finally {
                if (input != null) {
                    input.close();
                }
            }
        } catch (IOException ex) {
            throw new RuntimeException(ex);
        }
        file = null;
 
    }
}

設定檔如下,名稱jdbc.properties

需放至與classes同目錄(或jar同目錄)

ServerName=localhost
DatabaseName=test
port=3306
user=root
password=12345

讀取外部參數檔成設定值

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
package yku.setup;
 
import java.io.IOException;
 
public class P {
    private static java.util.Properties p = null;
 
    public static String getV(String value) {
        if (p.containsKey(value))
            return p.getProperty(value);
        else
            return "";
    }
 
    static {
        try {
            // 讀取properties檔
            java.io.File f = new java.io.File("default.properties");
 
            java.io.InputStream is = new java.io.FileInputStream(f);
 
            p = new java.util.Properties();
 
            p.load(is);
 
            is.close();
            java.util.Iterator itr = p.entrySet().iterator();
 
            while (itr.hasNext()) {
                Object key = itr.next();
                yku.log.out.print("預設值:" + key);
            }
        } catch (IOException ie) {
            ie.printStackTrace();
 
        }
 
    }
}

外部設定檔名稱default.properties

跟jdbc.properties放至相同目錄就可以了

Directory是xml產生目錄,Url_Directory是主要的DNS名稱,

ZipToFile是Zipe要存放的位置及名稱,SQL是向資料庫取得內容的語法,

FiledUrl FileTime FileFreq FilePriority是取得的欄位名稱

SubXmlName是xml的檔案名稱前致詞

Directory = d:/SiteMap/
Url_Directory=http://blog.yslifes.com
ZipToFile=d:/SiteMap/SiteMap.xml.zip
Sql = select * from sitemapinfo
FieldUrl = url
FieldTime = time
FieldFreq = freq
FieldPriority = priority
SubXmlName = Info

範例Sql如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE  `sitemapinfo` (
  `id` int(10) unsigned NOT NULL auto_increment,
  `url` varchar(500) NOT NULL,
  `time` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
  `freq` varchar(45) NOT NULL,
  `priority` double NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 
INSERT INTO sitemapinfo(url,time,freq,priority) values('/archives/620',DATE_FORMAT('20100305','%Y%m%d'),'Monthly',20);
INSERT INTO sitemapinfo(url,time,freq,priority) values('/archives/619',DATE_FORMAT('20100304','%Y%m%d'),'Weekly',100);
INSERT INTO sitemapinfo(url,time,freq,priority) values('/',DATE_FORMAT('20100301','%Y%m%d'),'Daily',30);
INSERT INTO sitemapinfo(url,time,freq,priority) values('/archives/basic',DATE_FORMAT('20100302','%Y%m%d'),'Yearly',70);

更詳細的內容可以下載原始碼檔案程式


Related Posts Plugin for WordPress, Blogger...

一個回應 to “[Java]SiteMap Creater-簡單的SiteMap建立程式”

PingBack List:

  1. 利用Eclipse製作可執行jar run

留下您想說的話:

*