目的是:不同平台、不同语言之间的数据交换与应用集成(C++、Java),客户程序中动态生成的数据以XML格式编码,通过Socket传送到服务器端,服务器端读取此数据流后进行相应的解码处理,重组得到相应的数据后进行相关处理。关键之处:将XML数据转换成Socket流,从Socket流中解码出XML数据。请不要告诉我说先保存为文件后再进行处理,如此将多出来不必要的io操作。曾考虑过XML-RPC以及SOAP,但对这两者感觉都不好,在我的问题域中。所以才想通过自己编写Socket方案来解决所遇到的问题。如有更好方案or建议,请不吝赐教
C++和Java之间就可以互相调用函数了。挺不错的。如果自己要传递XML只是作为文本的话,那就简单了。
var oHttpReq = new ActiveXObject("MSXML2.XMLHTTP");
oHttpReq.open( "POST" , url , false );
oHttpReq.onreadystatechange=function()
{
if( oHttpReq == null )
return;
if (oHttpReq.readyState==4)
{
if(oHttpReq.status==200)
{
result = oHttpReq.responseText;
var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
xmlDoc.async=false;
xmlDoc.loadXML(result);
这是获得返回的xml字符串
}
}
}
oHttpReq.setRequestHeader("Content-type", "text/xml");
oHttpReq.send(sendValue);
发送你拼好的字符串
关键是你要在客户端和服务器端定一个传输协议。
<webmethod id="service_order_to_cp">
<userid value="13246410019"/>
<encryptflag value="N"/>
<serviceid value="3168"/>
<ispack value="N"/>
<sub_type value="moth"/>
<orderdate value="2006-08-30 15:49:45" />
</webmethod>
把你要传的值放到相应的value值里面写输出流就可以了.具体的TAG可以随便定以的.
is not allowed.
org.xml.sax.SAXParseException: The processing instruction target matching "[xX][
mM][lL]" is not allowed.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.
java:264)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Doc
umentBuilderImpl.java:292)
at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:98)
at TCPServer.main(TCPServer.java:29)
来自服务端的异常The processing instruction target matching "[xX][mM][lL]" is not
allowed.
现在出现上述的异常,该如何解决?
XML数据本来就是文本, 文本写入到流直接使用XML Document对象即可>请不要告诉我说先保存为文件后再进行处理,如此将多出来不必要的io操作。
不用文本用内存也行, 如果使用DOM处理, 需要占用相当内存, 如果你的数据量不大, 使用DOM树存储临时数据没有问题. 如果数据量大, 就不能用DOM只能使用写文件或直接写socket流方式>曾考虑过XML-RPC以及SOAP,但对这两者感觉都不好,在我的问题域中。所以才想通过自己编写Socket方案来解决所遇到的问题。
用XML-RPC/SOAP和自己写本质是一样, SOAP更加通用, 自己写速度可能会更快写>如有更好方案or建议,请不吝赐教
虽然文件你不想用, 但如果数据量大, 通信条件不好的情况下, 使用临时文件是一个很好的解决方案