c#调用JAVA的Webservice处理XML数据及批量轮询的实现方法
前段时间做一个调用外单位WEBSERVICE的项目,项目完成的功能其实很简单,就是我们单位有很多车友会员,我们想对他们提供车辆违章信息告之服务!我们这边交警部门给我们开放了WS的接口,我们就是想通过这个WS,来轮询会员的违章信息!
其中那个Webservice使用JAVA的Xfire开发的,当时想像得很简单,因为WS(Webservice)可以跨平台调用,因此非常适合不同系统之间数据交换!网上也有很多调用的代码!但我在实际使用中还是遇到了一些问题!首先是我们要调用的那个WS数据管理非常严格,为了数据的安全,他们在中间加入防火墙,访问是通过VPN来进行的,并且他们对访问端口进行映射,我刚开始通过.net来添加WEB 服务,可以访问到方法名称,但在程序调用时报404错误!咨询了一下开发商,说是他们通过JAVA开发的程序调用没有问题!对于从未接触过JAVA的我来说安装JDK、TOMCAT、MyEclipse,折腾的不亦乐呼!从网上又找了些视频教程看了几天,好在JAVA和C#有点象,据说C#就是微软借鉴了JAVA很多优点!搞出这么一个C#的新语言!使用JAVA调用了一下,确实可以调用成功!至今我也没搞明白,.net为什么调用不成功,我只知道那两个地址的端口不一样,问题也就卡在这块了,但JAVA能调用成功,却不能理解,咨询了一下开发商那边一个很厉害的资深JAVA工程师(没想到居然还是个MM),说是因为两个平台底层的访问原理不同,后来通过我们上一级技术部门的帮助,给了一个解决方案:
通过本地使用JAVA来调用WS打包成一个代理方法并发布到本地TOMCAT,再通过.net使用request的方法返回结果!基本思路就是这样!
实现步骤:
(一)TOMCAT:http://localhost:8080/readvioinfo.jsp 通过在输入不同的参数返回不同的结果!如:http://localhost:8080/readvioinfo.jsp?hphm=京AW342&hpzl=02
(二)在.net中的代码实现:
实现的方法代码:
public string getXmlStr(string hphmcode)
{
string Url = "http://localhost:8080/readvioinfo.jsp";
string hphm = hphmcode;
string hpzl = "02";
//Encoding encoding = Encoding.GetEncoding("utf-8");
Encoding encoding = Encoding.GetEncoding("GB2312");
string postData = "hphm=" + hphm + "&hpzl=" + hpzl;
byte[] data = encoding.GetBytes(postData);
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);
//发送数据
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = data.Length;
Stream requestStream = request.GetRequestStream();
requestStream.Write(data, 0, data.Length);
requestStream.Close();
//接收返回值
HttpWebResponse res = (HttpWebResponse)request.GetResponse();
StreamReader sReader = new StreamReader(res.GetResponseStream(), System.Text.Encoding.UTF8);
string strBack = sReader.ReadToEnd();
//Response.Write(strBack);
sReader.Close();
res.Close();
return strBack;
}
(三)对返回XML格式数据的处理:
JAVA WS返回的结果是XML格式的字符串:如下
<?xml version="1.0" encoding="utf-8"?>
<root>
<code>1</code>
<count>2</count>
<vioInfo>
<wfdz>建设路700米处</wfdz>
<wfsj>2010-01-15</wfsj>
<clbj>未处理</clbj>
<jkbj>未交款</jkbj>
<wfnr>机动车行驶超过规定时速30%以上不足50%的</wfnr>
</vioInfo>
<vioInfo>
<wfdz>华南路强生中学北300米处</wfdz>
<wfsj>2009-09-08</wfsj>
<clbj>未处理</clbj>
<jkbj>未交款</jkbj>
<wfnr>机动车行驶超过规定时速30%以上不足50%的</wfnr>
</vioInfo>
</root>
在.net可以方便的对XML数据进行读取和处理!个人感觉比JAVA要方便啊,JAVA要通过SAX和DOM4J(反正我没研究过)!我是将返回结果放到一个富文本框rtb_result里。
实现代码如下:
string strXML = this.rtb_result.Text.Trim();
XmlDocument doc = new XmlDocument();
doc.LoadXml(strXML);
XmlElement root = doc.DocumentElement;
XmlNodeList mynodelist = doc.SelectNodes("//root/vioInfo"); //查询全部vioInfo节点
if (mynodelist.Count !=0)
{
//循环遍历节点,查询是否存在该节点
for (int i = 0; i < mynodelist.Count; i++)
{
this.rtb_result.Text="违章地点:"+mynodelist[i].ChildNodes[0].InnerText + "\n";
this.rtb_result.Text+="违章时间:"+mynodelist[i].ChildNodes[1].InnerText + "\n";
this.rtb_result.Text +="处理情况:"+ mynodelist[i].ChildNodes[2].InnerText + "\n";
this.rtb_result.Text +="交款情况:"+ mynodelist[i].ChildNodes[3].InnerText + "\n";
this.rtb_result.Text +="违章内容:"+ mynodelist[i].ChildNodes[4].InnerText + "\n";
}
}
else
{
this.rtb_result.Text = "无返回的结果集!";
}
上面的代码完成将返回的XML数据读取我们需要的节点内容并返回到富文本框上显示出来
(四)怎么实现批量轮询的功能,这也是我们最终要得到的功能!我的设想是让用户通过导入一个记录包括车牌号码、手机号码、车辆类型等会员信息的EXCEL文件,将会员信息导入到数据控件中,再通过逐条读取信息与信息做为上面步骤的查询参数,每次读取将返回的信息追加到窗体的富文本框中,整个循环完成后也就完成了本次会员的违章信息轮询!在读取EXCEL文档我采用了ADO.NET,将EXCEL做为一个数据源来加载的,加载完成后,采用datareader控制来逐条读数据,这样速度比较快!完成的代码如下:
private void btn_getdata_Click(object sender, EventArgs e)
{
this.openFileDialog1 = new OpenFileDialog();
openFileDialog1.Filter = "Excel files(*.xls)|*.xls";
if (this.openFileDialog1.ShowDialog() == DialogResult.OK)
{
loadXsl2Reader();
}
}
public void loadXsl2Reader()
{
int lookNum = 0;
FileInfo fileInfo = new FileInfo(openFileDialog1.FileName);
string filePath = fileInfo.FullName;
string connExcel = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filePath + ";Extended Properties=Excel 8.0";
try
{
OleDbConnection oleDbConnection = new OleDbConnection(connExcel);
oleDbConnection.Open();
//获取excel表
DataTable dataTable = oleDbConnection.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
//获取sheet名,其中[0][1]...[N]: 按名称排列的表单元素
string tableName = dataTable.Rows[0][2].ToString().Trim();
tableName = "[" + tableName.Replace("'", "") + "]";
//利用SQL语句从Excel文件里获取数据并填充到datareader中
string query = "SELECT 车牌号码,right(车架号,4) as 验证码,手机号码 FROM " + tableName;
OleDbCommand usrCMD = oleDbConnection.CreateCommand();
usrCMD.CommandText = query;
OleDbDataReader usrd= usrCMD.ExecuteReader();
this.rtb_result.Text = "车牌号码 手机号 违章地址 违章时间 处理情况 交款情况 违章内容\n";
//string rtbresult="";
while (usrd.Read())
{
string para_cphm = usrd["车牌号码"].ToString().Trim();
string para_code = usrd["验证码"].ToString().Trim();
string para_mbphone = usrd["手机号码"].ToString().Trim();
string strXML = GetResultXML(para_cphm, para_code).Trim();
XmlDocument doc = new XmlDocument();
doc.LoadXml(strXML);
XmlElement root = doc.DocumentElement;
XmlNodeList mynodelist = doc.SelectNodes("//root/vioInfo"); //查询全部vioInfo节点
if (mynodelist.Count != 0)
{
//MessageBox.Show("共有" + mynodelist.Count + "条违章记录!");
//循环遍历节点,查询是否存在该节点
//this.rtb_result.Text = "";
for (int i = 0; i < mynodelist.Count; i++)
{
lookNum += 1;
this.label3.Text = "正在匹配ing......:已匹配" + lookNum.ToString() + "条记录!";
this.rtb_result.Text += para_cphm+" ";
this.rtb_result.Text += para_mbphone + " ";
this.rtb_result.Text += mynodelist[i].ChildNodes[0].InnerText+" ";
this.rtb_result.Text += Convert.ToDateTime(mynodelist[i].ChildNodes[1].InnerText).ToString("yyyyMMdd-HH:mm")+" ";
/*上句为什么要这么写是为了将DATETIME显示为一个20100801-21:25格式的字符串,方便EXCEL导入文本时不会出现字段错误*/
this.rtb_result.Text += mynodelist[i].ChildNodes[2].InnerText +" ";
this.rtb_result.Text += mynodelist[i].ChildNodes[3].InnerText + " ";
this.rtb_result.Text += mynodelist[i].ChildNodes[4].InnerText + "\n";
//RichTextBox中的文本自动下滚到最后,使窗体在执行数据轮询时显示滚动数据
this.rtb_result.Select(this.rtb_result.TextLength, 0);
this.rtb_result.Focus();
this.rtb_result.ScrollToCaret();
}
}
}
usrd.Close();
oleDbConnection.Close();
MessageBox.Show("轮询结束!共有" + lookNum.ToString() + "条违章记录!请点击保存将查询结果保存为文本文件");
this.label3.Text = "共查询到:"+lookNum.ToString()+"条记录!";
}
catch (Exception ex)
{
MessageBox.Show(ex.ToString());
}
}
(五)导出到文本文件:
private void button5_Click(object sender, EventArgs e)
{
if (this.rtb_result.Text != "")
{
this.saveFileDialog1.Filter = "txt files(*.txt)|*.txt";
this.saveFileDialog1.FilterIndex = 2;
this.saveFileDialog1.RestoreDirectory = true;
if (saveFileDialog1.ShowDialog() == DialogResult.OK)
{
string filepath = "";
string resultStr = this.rtb_result.Text.Replace("\n", "\r\n"); ;
filepath = saveFileDialog1.FileName;
StreamWriter sTmp = new StreamWriter(filepath);
sTmp.WriteLine(resultStr);
sTmp.Flush();
sTmp.Close();
MessageBox.Show("文件已成功导出到" + filepath);
}
}
else
{
MessageBox.Show("没有记录!");
}
}
导出的文本文件可以通过EXCEL导入进来再编辑、修改、过滤、筛选等操作就比较自由了!当然也把代码修改一下直接导出EXCEL也是很方便的!上述的功能还很简单,只是完成了基本功能的实现,程序还是要通过后期的使用不断完善!
c#调用JAVA的Webservice处理XML数据及批量轮询的实现方法的更多相关文章
- Delphi调用JAVA的WebService上传XML文件(XE10.2+WIN764)
相关资料:1.http://blog.csdn.net/luojianfeng/article/details/512198902.http://blog.csdn.net/avsuper/artic ...
- .NET调用JAVA的WebService方法
调用WebService,最简单的办法当然是直接添加WEB引用,然后自动产生代理类,但是在调用JAVA的WebService时并没有这么简单,特别是对于SoapHeader的处理,在网上也有相关资料, ...
- delphi7编写客户端调用java服务器端webservice示例
1. 首先取得java-webservice服务器端地址.我的是:http://localhost:8080/mywebservice/services/mywebservice?wsdl 2. 然后 ...
- C#调用Java的WebService添加SOAPHeader验证(2)
C#调用Java的WebService添加SOAPHeader验证 上一篇链接如上,更像是 Net下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) 来处理xml, ...
- C#调用Java的WebService添加SOAPHeader验证
C#调用Java的WebService添加SOAPHeader验证(2) 1.问题描述 调用的Java的webservice string Invoke(string func, string req ...
- WebService传递XML数据 C#DataSet操作XML 解析WebService返回的XML数据
Webservice传递的数据只能是序列化的数据,典型的就是xml数据. /// <summary> /// 通过用户名和密码 返回下行数据 /// & ...
- Delphi动态调用Java的WebService 转
Delphi动态调用Java的WebService —— 基于“Axis2发布WebService例子(HelloWorld)” uses ComObj; var WsObject: Variant; ...
- Android使用webService(发送xml数据的方式,不使用jar包)
Android使用webService可以用ksoap2.jar包来使用.但是我觉得代码不好理解,而且记不住. 所以我查询了好多资料,以及自己的理解.可以用代码发送http请求(发送xml数据)来访问 ...
- PHP调用JAVA的WebService简单实例
使用PHP调用JAVA语言开发的WebService.客户端提交两个String类型的参数,服务端返回一个对象类型.服务端使用AXIS-1.4作为SOAP引擎.客户端为PHP5.2.9,使用NuSOA ...
随机推荐
- CSS区块、浮动、定位、溢出、滚动条
CSS中区块的使用 CSS中浮动的使用 CSS中定位的使用 CSS中溢出的使用 CSS中滚动条的使用 17.1 CSS中区块的使用 属性名称 属性值 ...
- API功能测试如何实施(转载自测试之道 微信公众号)
什么是API 关于定义什么的,直接维基可得: API(Application Programming Interface,简称:API),又称为应用编程接口,就是软件系统不同组成部分衔接的约定.由于近 ...
- http协议分析工具
资源推荐 1.Wireshark抓包软件 Wireshark(前称Ethereal)是一个网络封包分析软件.网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshar ...
- 编写一个Animal类,具有属性:种类;具有功能:吃、睡。定义其子类Fish 和Dog,定义主类E,在其main方法中分别创建其对象并测试对象的特性。
package animal; public class Animal { //成员属性 private String kind; public String getKind() { return k ...
- Objective-C中的Block(闭包) (轉載)
来源: 伯乐在线 - 青玉伏案 链接:http://ios.jobbole.com/83229/ 学习OC有接触到一个新词Block(个人感觉又是一个牛气冲天的词),但不是新的概念,不是新的东西.学过 ...
- maven快速入门
一.maven maven可以说是管理项目的优秀工具,管理jar包 二.mave安装 1.先安装jdk(本文不详细讲) 2.安装maven ①.maven下载 http://maven.apach ...
- Linux下查看CPU型号,内存大小,硬盘空间命令
1 查看CPU 1.1 查看CPU个数 # cat /proc/cpuinfo | grep "physical id" | uniq | wc -l 2 **uniq命令:删除重 ...
- Codeforces Codeforces Round #319 (Div. 2) A. Multiplication Table 水题
A. Multiplication Table Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/57 ...
- WCF之初体验
什么是WCF? WCF的全称是:Windows通信基础(WindowsCommunication Foundation).本质来讲,他是一套软件开发包. WCF和WebService的差别 Webse ...
- Python标准库:内置函数reversed(seq)
本函数是返回序列seq的反向訪问的迭代子. 样例: #reversed() for i in reversed([2, 3, 4, 5]): print(i, end = ',') 结果输出例如以下: ...