这次的题目很简单,中国银行有一个查当天汇率的网页(http://www.bank-of-china.com/info/qpindex.shtml),不过是传统的Html格式,而其又没有提供Xml格式或者WebService查询。现在如果希望其他的信息系统能够随时读取其中的数据,那么方便的莫过于中行提供一个WebService接口供大家调用,这也是典型的安全的WebService应用。可惜中行没有做,那么我们能不能自己来做呢?当然可以,只要用程序分析其html网页,那么就可以很容易的读取其中的数据。文本分析,当然要看我们的"Regular Expression"(呵呵,其实这才是写这个程序的真实目的 -- 应用正则表达式。)
中行的页面类似于:
日期:2004/09/30 有效期至2004/10/07
货币名称 现汇买入价 现钞买入价 卖出价 基准价
英镑 1488.1700
1453.1500
1492.6400
港币 105.9700
105.3300
106.2900
106.1100
美元 826.4200
821.4500
828.9000
827.6600
瑞士法郎 655.9300
641.1400
659.2200
新加坡元 488.7600
477.2600
490.2300
瑞典克朗 112.4900
109.8400
112.8300
丹麦克朗 136.5900
133.3700
137.0000
挪威克朗 121.9500
119.0800
122.3100
日元 7.4344
7.3785
7.4717
7.4519
加拿大元 650.8000
635.4800
652.7600
澳大利亚元 591.9900
578.6400
594.9600
欧元 1019.6400
1010.9600
1022.7000
1019.7000
澳门元 103.2200
102.6000
103.5300
菲律宾比索 14.6700
14.3300
14.7200
泰国铢 19.9000
19.4300
19.9600
新西兰元 553.7000
555.3600
对其代码分析后,给出了一个正则表达式,当然这个表达式还不完善,但是针对目前比较固定的中行的汇率页面来说,暂时还没有问题。
@"<tr bgcolor='#\w+' ><td height='20'>(?<currency>.*)</td>\s*" +
@"<td height='20'><p align='right'>(?<bankbuytt>\d*.?\d*)( )+.?</td>\s*" +
@"<td height='20'><p align='right'>(?<buynotes>\d*.?\d*)( )+.?</td>\s*" +
@"<td height='20'><p align='right'>(?<sell>\d*.?\d*)( )+.?</td>\s*" +
@"<td height='20'><p align='right'>(?<base>\d*.?\d*)( )+.?</td>\s*"
然后过滤就非常简单了。我一直以为代码是最好的说明,特别是对于优雅的语言来说,因为我就不多说了,代码伺候。
这是所建WebService页面ForeignExchange.asmx的代码:
using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Web;
using System.Net;
using System.Web.Services;
using System.Xml;
using System.Text;
using System.Text.RegularExpressions;
using System.IO;
namespace ChinaBank
{
/// <summary>
/// Summary description for ForeignExchange.
/// </summary>
[WebService(Namespace="http://dancefires.com/ChinaBank/")]
public class ForeignExchange : System.Web.Services.WebService
{
public ForeignExchange()
{
//CODEGEN: This call is required by the ASP.NET Web Services Designer
InitializeComponent();
}
#region Component Designer generated code
//Required by the Web Services Designer
private IContainer components = null;
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
}
/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing )
{
if(disposing && components != null)
{
components.Dispose();