用axis方式调用WebService,返回类型为字符串数组(包括把数据库数据导出存为xml,xml转化成字符串)

原创 2015年07月09日 13:31:05
import java.io.File;
import java.rmi.RemoteException;

import javax.xml.namespace.QName;
import javax.xml.rpc.ServiceException;

import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;
public class WeatherWebService {
	
	//这个方法返回所有工单记录
	public static String[] selectAllCargoInfor() {
		// webservice路径
		// 这里后面加不加 "?wsdl" 效果都一样的
		String endpoint = "http://180.76.147.120:8989/Service1.asmx?wsdl";
		String[] res = null;
		
        //webService 命名空间
		String nameSpace = "http://dengsss.org/";  
		// 查询所有数据的接口方法名
		String operationName = "selectAllOrder_Record";
		
		String soapAction = "http://dengsss.org/selectAllOrder_Record";
		// 定义service对象
		Service service = new Service();
		// 创建一个call对象
		Call call;
		try {
			call = (Call) service.createCall();
			// 设置目标地址,即webservice路径
			call.setTargetEndpointAddress(endpoint);
			// 设置操作名称,即方法名称
			call.setOperationName(new QName(nameSpace,operationName));
			
//            // 此处需要配置传入参数类型与参数名称,如果未设置jax-ws则无法接受参数,会认为传入的参数为null
//            call.addParameter(new QName(nameSpace, "TransNo"),
//                    org.apache.axis.encoding.XMLType.XSD_STRING,
//                    javax.xml.rpc.ParameterMode.IN);

			// 设置返回值类型
			// 对于返回是字符串数组的返回类型只有这两种可行
			call.setReturnClass(java.lang.String[].class);
			call.setUseSOAPAction(true);
			call.setSOAPActionURI(soapAction);
			try {
				res = (String[]) call.invoke(new Object[] {});
			} catch (RemoteException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			// 如果返回类型是org.apache.axis.encoding.XMLType.SOAP_VECTOR时用下面的转型接收
			// Vector v=(Vector) call.invoke(new Object[]{cityCode,userId});
   
		} catch (ServiceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return res;
	}


WebService端的接口方法已经存在,这里用axis方式调用需要的方法。

这里的方法返回的是字符串数组。

如果需要传入参数,那么就配置传入参数类型与参数名称,

因为我是需要把本地数据库的数据传到websevice的数据库并存起来,传输的方式为把本地数据库的数据导出存为一个XML格式文件,然后再把这个XML文件转化成字符串,并把它作为传递的参数,在这个过程中主要有两歩:

1.把数据库表中数据导出存为xml格式文件,代码如下:

<pre name="code" class="java">import java.io.File;
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

/**
 * 导出数据库的数据并存为xml格式文件
 * @author Administrator
 *
 */
public class TestDB2Xml {
	
   public static void main(String[] args) {
	   
	String str_query;
	PreparedStatement pstmt;
	ResultSet rs;
    List<String[]> result = new ArrayList<String[]>();
    String line[]= null;
    String JDRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
	String  connectDB="jdbc:sqlserver://127.0.0.1:1433;DatabaseName=iODH_DataBase";
	
	try {			
		Class.forName(JDRIVER);			
	}
	catch (ClassNotFoundException e) {			
		//e.printStackTrace();
		System.out.println("加载数据库引擎失败fff");
		System.exit(0);
	} 
	
	try {	
        Connection con = DriverManager.getConnection(connectDB, "sa", "666666");// 连接数据库对象
        str_query = "SELECT * FROM Order_Record";
        pstmt = con.prepareStatement(str_query);
        rs = pstmt.executeQuery();
        
	    while(rs.next()) {
	    	//定义一个String数组,这个数组中存取每条工单记录的每个数据
	      line = new String[10];
	      line[0] = rs.getString(1);
	      line[1] = rs.getString(2);
	      line[2] = rs.getString(3);
	      line[3] = rs.getString(4);
	      line[4] = rs.getString(5);
	      line[5] = rs.getString(6);
	      line[6] = rs.getString(7);
	      line[7] = rs.getString(8);
	      line[8] = rs.getString(9);
	      line[9] = rs.getString(10);
	      result.add(line);   //把每一条工单数据存到result容器中
	    }
	    DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
	    DocumentBuilder builder=factory.newDocumentBuilder();
	    //新建一个document对象
	    Document document=builder.newDocument();//Creat xml document
	    document.setXmlVersion("1.0");
	
	    Element root=document.createElement("orderList");//rootname of xml document
	    document.appendChild(root);//creat root of xml document
	    for(int k=1; k<=result.size(); k++) {
	    	root.appendChild(document.createElement("DOrder_Record"));//elementname of xml document
	    }
	    NodeList nodeList=document.getElementsByTagName("DOrder_Record");  
	    int size=nodeList.getLength();
	    for(int k=0; k<size; k++) {
	    	Node node=nodeList.item(k); 
	    	if(node.getNodeType()==Node.ELEMENT_NODE) {
	    		String[] temp = (String[])result.get(k);
	    		Element elementNode=(Element)node;
	    		//把前面result容器中的数据对应加入到节点当中,注意!!目前如果数据库中某列有null值,那边这边就会报错,需要进行判定
	    		for (int i = 0; i < temp.length; i++) {
	    			if (temp[i] == null) {
	    				temp[i] = "";               //变为""值后,WebServer端接收到数据后不能存入数据库
	    			}
	    		}
	    		//为每个工单增加具体属性节点,并给每个节点赋值
	    		elementNode.appendChild(document.createElement("Order_ID")).appendChild(document.createTextNode(temp[0]));
	    		elementNode.appendChild(document.createElement("Order_Type")).appendChild(document.createTextNode(temp[1]));
	    		elementNode.appendChild(document.createElement("Site_Addr")).appendChild(document.createTextNode(temp[2]));
	    		elementNode.appendChild(document.createElement("East_Longitude")).appendChild(document.createTextNode(temp[3]));
	    		elementNode.appendChild(document.createElement("North_Latitude")).appendChild(document.createTextNode(temp[4]));
	    		elementNode.appendChild(document.createElement("Worker_Name")).appendChild(document.createTextNode(temp[5]));
	    		elementNode.appendChild(document.createElement("Finshin_Staut")).appendChild(document.createTextNode(temp[6]));
	    		elementNode.appendChild(document.createElement("Finshin_Date")).appendChild(document.createTextNode(temp[7]));
	    		elementNode.appendChild(document.createElement("Device_ID")).appendChild(document.createTextNode(temp[8]));
	    		elementNode.appendChild(document.createElement("Work_DateLine")).appendChild(document.createTextNode(temp[9]));
	    	} 
	    }
	    TransformerFactory transFactory=TransformerFactory.newInstance();
	    Transformer transformer=transFactory.newTransformer();
	    DOMSource domSource=new DOMSource(document);
	    File file=new File("OederRecord.xml");//save xml document as url
	    FileOutputStream out=new FileOutputStream(file);
	    StreamResult xmlResult=new StreamResult(out);
	    transformer.transform(domSource,xmlResult);
	    
	}	catch(Exception e) {
		
	     System.out.println(e);
	    }
	}
}

到这里,数据库取出的数据就被存为一个xml文件,

</pre><pre name="code" class="java">2.XML文件转化成字符串,代码如下
<pre name="code" class="java">        SAXReader reader = new SAXReader();  
        //读取XML文件,然后 转换成Document  
        Document document = reader.read(new File("OederRecord.xml"));  
        //document转换为String字符串  
        String documentStr = document.asXML();  
        System.out.println("document 字符串:" + documentStr); 

用dom4j的方式解析xml。

webserver端接受到字符串之后再进行处理。
当前这种方式中,出现一个错误,

AxisFault
 faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server
 faultSubcode: 
 faultString: 服务器无法处理请求。 ---&gt; 未将对象引用设置到对象的实例。
 faultActor: 
 faultNode: 
 faultDetail: 
<span style="white-space:pre">	</span>{http://xml.apache.org/axis/}stackTrace:服务器无法处理请求。 ---&gt; 未将对象引用设置到对象的实例。
<span style="white-space:pre">	</span>at org.apache.axis.message.SOAPFaultBuilder.createFault(SOAPFaultBuilder.java:222)
<span style="white-space:pre">	</span>at org.apache.axis.message.SOAPFaultBuilder.endElement(SOAPFaultBuilder.java:129)
<span style="white-space:pre">	</span>at org.apache.axis.encoding.DeserializationContext.endElement(DeserializationContext.java:1087)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.endElement(AbstractSAXParser.java:609)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanEndElement(XMLDocumentFragmentScannerImpl.java:1781)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl$FragmentContentDriver.next(XMLDocumentFragmentScannerImpl.java:2957)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:606)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:117)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:510)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:848)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:777)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:649)
<span style="white-space:pre">	</span>at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl.parse(SAXParserImpl.java:333)
<span style="white-space:pre">	</span>at org.apache.axis.encoding.DeserializationContext.parse(DeserializationContext.java:227)
<span style="white-space:pre">	</span>at org.apache.axis.SOAPPart.getAsSOAPEnvelope(SOAPPart.java:696)
<span style="white-space:pre">	</span>at org.apache.axis.Message.getSOAPEnvelope(Message.java:435)
<span style="white-space:pre">	</span>at org.apache.axis.handlers.soap.MustUnderstandChecker.invoke(MustUnderstandChecker.java:62)
<span style="white-space:pre">	</span>at org.apache.axis.client.AxisClient.invoke(AxisClient.java:206)
<span style="white-space:pre">	</span>at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
<span style="white-space:pre">	</span>at org.apache.axis.client.Call.invoke(Call.java:2767)
<span style="white-space:pre">	</span>at org.apache.axis.client.Call.invoke(Call.java:2443)
<span style="white-space:pre">	</span>at org.apache.axis.client.Call.invoke(Call.java:2366)
<span style="white-space:pre">	</span>at org.apache.axis.client.Call.invoke(Call.java:1812)
<span style="white-space:pre">	</span>at ss.xml.WeatherWebService.uploadOrder_Record(WeatherWebService.java:143)
<span style="white-space:pre">	</span>at ss.xml.WeatherWebService.main(WeatherWebService.java:167)
webserver端接受到字符串之后再进行处理。
当前这种方式中,出现一个错误,
这个错误不影响数据的传到webserver,但还没有具体的解决办法<span style="font-family:Arial, Helvetica, sans-serif;"><span style="white-space: normal;">

</span></span>

C# WebService中将集合数据转化为字符串(json,xml )的方式

在写webservice的时候需要将从数据库中查询出的数据(各种集合)转化为json字符串。 如果在取出集合后再对集合进行遍历,拼接成xml就太麻烦了。 所以首先介绍一下通过标准方法自动转为jso...

java使用jxl导出excel字符串类型转化成数值型

导出excel后 发现 数值类型的字段  在excel中表现为文本类型,这样不利于

webservice 传输Xml文档时的XmlDocument会被直接转化成XmlNode 想要把它转回到XmlDocument采用如下变红的方法。

本分步指南介绍了如何在.net 应用程序中执行 Web 服务方法的采取了 如下 的参数或返回 如下 的对象的编写代码。 回到顶端 Introduction 如下 对象作为参数传递给 We...

flex调用webservice返回xml格式字符串,并遍历

C#中如何把XML转化成强类型操作

最近因工作中需要对XML进行操作,老大传授了一种非常简便的操作XNL的方法,就是把XML文件转成强类型! 操作步骤如下:  1、在项目中添加一个XML文件  2、把生成的XML文件通过VS...

java字符串数组的增删改查

  • 2016年04月03日 20:45
  • 21KB
  • 下载

C#字符串数组求交集并集

  • 2013年11月25日 21:29
  • 2KB
  • 下载

java---字符串操作(分割,大小写转化,去除首末空格,截取字串,转化成字符数组)

5、字符串分割: split()   public class StringSplit { public static void main(String[] args) { String m...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用axis方式调用WebService,返回类型为字符串数组(包括把数据库数据导出存为xml,xml转化成字符串)
举报原因:
原因补充:

(最多只允许输入30个字)