社区
Java EE
帖子详情
关于Document对象的传输的问题,Norwaywoods() 请进
huangry
2003-03-27 01:19:44
你上次说如果要传输Document对象的话,只有两种方法。
但我想,既然Document对象是一个xml文档,是不是可以把root元素直接加入到我所要传输的SOAP信息中呢? 不知道您明白我的意思没有
这样可行吗? 可以直接写SOAP传送的那个XML结构吗?
...全文
178
38
打赏
收藏
关于Document对象的传输的问题,Norwaywoods() 请进
你上次说如果要传输Document对象的话,只有两种方法。 但我想,既然Document对象是一个xml文档,是不是可以把root元素直接加入到我所要传输的SOAP信息中呢? 不知道您明白我的意思没有 这样可行吗? 可以直接写SOAP传送的那个XML结构吗?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
38 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
Norwaywoods
2003-03-31
打赏
举报
回复
我估计你的问题是因为没有把CDATA的信息去掉。
你拿到的最初的字符串是这样的:
<![CDATA[
<?xml version="1.0" encoding="UTF-8"?><root>
<String1>HelloWorld</String1>
</root>
]]>
你必须去头去尾,变成下面的样子:
<?xml version="1.0" encoding="UTF-8"?><root>
<String1>HelloWorld</String1>
</root>
最后是代码:
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.SOAPBodyElement;
import org.apache.axis.utils.Options;
import org.apache.axis.utils.XMLUtils;
/*import org.w3c.dom.CDATASection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;*/
import org.jdom.*;
import org.jdom.output.*;
import org.jdom.input.*;
import javax.xml.namespace.QName;
public class TestCDATA {
public static void main(String[] args)
{
try {
String endpoint =
"http://localhost:8082/axis/services/MyService";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName("http://soapinterop.org/", "serviceMethod"));
String ret = (String) call.invoke( new Object[] { "Hello!" } );
String content = ret.substring(9, ret.length() - 3);
System.out.println("Return: " + content + "");
SAXBuilder ix = new SAXBuilder();
Document doc = ix.build(new java.io.StringReader(content));
XMLOutputter out = new XMLOutputter();
out.output(doc,System.out);
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
huangry
2003-03-31
打赏
举报
回复
谢谢 我今天昨天有其他的事情所以耽搁了 你的代码确实是好了 我至少能够收到一个这个完整的string了 哈哈 开心
但是我现在试图把它转换成一个doc, 并且写入一个文件是又错了,能帮我看一下吗?
SAXBuilder ix = new SAXBuilder();
Document doc = ix.build(ret);
String indent = " ";
boolean newLines = true;
XMLOutputter outp = new XMLOutputter(indent,newLines,"GB2312");
outp.output(doc, new FileOutputStream("e:\\exampleB.xml"));
是不是我对于build()的调用错了? 你说该转成一个stream,怎么弄的 他的文档说明说是可以把string作为参数的嘛
Norwaywoods
2003-03-30
打赏
举报
回复
还有我的XML:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<String1>HelloWorld</String1>
</root>
Norwaywoods
2003-03-30
打赏
举报
回复
好吧!
服务端:
package samples.cdata;
import javax.xml.*;
import org.jdom.output.*;
import org.jdom.*;
import org.jdom.input.*;
import java.io.*;
public class MyService {
public String serviceMethod (String arg)
{
String str = "";
try
{
SAXBuilder sb = new SAXBuilder();
Document doc = sb.build(new FileInputStream("c:\\test.xml"));
XMLOutputter xo = new XMLOutputter();
String a = xo.outputString(doc);
System.out.println("A content: " + a);
// String a = "<A>ABCDEFG</A>";
// String a = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><root>ABC</root>";
// String a = "<?xml version="1.0" encoding="UTF-8"?><root>ABC</root>";
str = "<![CDATA[" + a + "]]>";
System.out.println("The String will be return" + str);
}
catch(IOException e)
{
System.out.print(e.toString());
}
catch(JDOMException e)
{
System.out.print(e.toString());
}
return str;
}
}
客户端:
package com.norwaywoods;
import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.message.SOAPBodyElement;
import org.apache.axis.utils.Options;
import org.apache.axis.utils.XMLUtils;
import org.w3c.dom.CDATASection;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import javax.xml.namespace.QName;
public class TestCDATA {
public static void main(String[] args)
{
try {
String endpoint =
"http://localhost:8082/axis/services/MyService";
Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress( new java.net.URL(endpoint) );
call.setOperationName(new QName("http://soapinterop.org/", "serviceMethod"));
String ret = (String) call.invoke( new Object[] { "Hello!" } );
System.out.println("Return: " + ret + "");
} catch (Exception e) {
System.err.println(e.toString());
}
}
}
huangry
2003-03-30
打赏
举报
回复
你能不能把你调试我的MyService.java的时候的客户端的程序代码让我看一下,我会不会是那个里面出错了
huangry
2003-03-30
打赏
举报
回复
好,我再试试
huangry
2003-03-29
打赏
举报
回复
在使用GBK的时候,错误是:
org.jdom.JDOMException: Error on line 1: Invalid encoding name "GBK".
后来改成GB2312以后 错误就是那句有些古怪看不太懂的话了
huangry
2003-03-29
打赏
举报
回复
to Norwaywoods():
我另外开了一个帖子想给你分数, 本来是想写的标题是:
菜鸟请Norwaywoods() 进来拿分
可是我一个不小心,居然写成了:
请Norwaywoods()菜鸟进来拿分,实在是抱歉得很 :( 希望不要见怪,我也不知道怎样改标题名字,所以就这样算了
Norwaywoods
2003-03-29
打赏
举报
回复
我想还是那个GBK的问题吧!你改成gb2312试试吧!
huangry
2003-03-29
打赏
举报
回复
<?xml version="1.0" encoding="GBK"?>
<bookList>
<book>
<name>Java</name>
<author>tom</author>
<publishDate>2002-6-6</publishDate>
<price>35.0</price>
</book>
<book>
<name>XML Java Implementation</name>
<author>Li Si</author>
<publishDate>2002-9-16</publishDate>
<price>92.0</price>
</book>
</bookList>
Norwaywoods
2003-03-29
打赏
举报
回复
你把你的Xml文件的内容贴出来看看!
huangry
2003-03-29
打赏
举报
回复
唉
这句话什么意思? 我看不懂他说什么
org.jdom.JDOMException: Error on line 1: The markup in the document preceding th
e root element must be well-formed.
他指我root元素的什么东西的格式不对?
还有,我觉得很奇怪,我刚才之所以没有注意到GBK的问题是因为我前几天在试着熟悉JDOM的时候,我就是用了一个带有形如<?xml version="1.0" encoding="GBK"?> 的开头定义的XML文件,我当时没有涉及网络,只是尝试着对XML文件进行各种操作学习一下, 在那个时候,我并没有碰到任何的报错,但是一放到网络里面,他就开始不劲,我觉得有点莫名其妙,算了也不去管它这个鸟问题了,我也只是随便说说
huangry
2003-03-29
打赏
举报
回复
哦, 我刚刚也意识到了这一点,所以急急忙忙地赶过来想要把刚刚那条帖子删掉,结果发现你已经回复了 :(
实在是好弱智的错误,我已经昏了头了
Norwaywoods
2003-03-29
打赏
举报
回复
唉~~~~~~~~~代码?
哈,我猜猜是不是你要读取的那个exampleA.xml里面的内容是类似下面的:
<?xml version="1.0" encoding="GBK"?>
....................................
把这个GBK改成gb2312试试!JDom好象不支持GBK!
huangry
2003-03-29
打赏
举报
回复
谢谢 刚才那个错误的原因是需要再设置以后重新启动axis服务 ;-P , 我太心急了
可是现在仍然有问题的说, 对不起啊, 我也知道老是这样缠着你问问题不太好,我自己都感觉不好意思了,可是因为这个东西时间比较急着要弄出来,又加上我老是有些其他的事情要烦,所以我暂时没有多少时间去研究xmljava soap 这些东西 所以还是要麻烦你
现在运行还是有错误,现在抛出的异常是:
org.jdom.JDOMException: Error on line 1: Invalid encoding name "GBK".
可是要命的是我在这两个服务器端和客户端的代码中都没有对编码进行设置阿,这是为什么呢
实在是迷惘
Norwaywoods
2003-03-29
打赏
举报
回复
对了!再给你一个建议:
不要用JBuilder8.0自带的Apache Axis。版本旧不说,Borland还做了些手脚,可能会影响发布。最好用正中的Apaceh Axis.
Norwaywoods
2003-03-29
打赏
举报
回复
好了,你的这个问题已经解决了。是这样的:我想你是用JBuilder编译MyService.java得到了MyService.class文件,然后把这个文件放到Tomcat的servlet类路径中去的吧。由于在Tomcat的classloader可以访问的范围内,没有jdom.jar这个文件,而你的类又用到了它,所以在运行的时候会出现问题(java.lang.reflect.InvocationTargetException),讲的深一点就是你的Tomcat容器在利用反射机制实例化你的MyService类的时候,因为找不到相应的jdom.jar而导致,实例化失败,因此会报出上面的错!
补救方法,其实很简单:
将jdom.jar文件放到你使用的Tomcat的lib目录下("\Tomcat\common\lib"或者你的Webapps的下的"\Tomcat\webapps\axis\WEB-INF\lib"),我用的是Tomcat4.1.18,具体情况具体分析!这样就可以保证正常使用了。你的例子我已经调试通过,一切正常!
下面说说我昨天发现的另一个解决方法:
这种方法更加好,它直接把CDATA字段加入到Soap中去,而不象上一种方法,是把CDATA放到一个String字段里,如下:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:serviceMethodResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://soapinterop.org/">
<serviceMethodReturn xsi:type="xsd:string"><![CDATA[<?xml version="1.0" encoding="UTF-8"?><root>
<String1>HelloWorld</String1>
</root>]]></serviceMethodReturn>
</ns1:serviceMethodResponse>
</soapenv:Body>
</soapenv:Envelope>
而是,如下:
<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body><ns1:e1 xmlns:ns1="urn:foo">Hello</ns1:e1><ns2:e1 xmlns:ns2="urn:foo">World</ns2:e1><ns3:e3 xmlns:ns3="urn:foo"><![CDATA[Text with
Important <b> whitespace </b> and tags! ]]></ns3:e3> </soapenv:Body>
</soapenv:Envelope>
这样做更加自然,限于篇幅,我这里就不说了。也讲不清楚!
祝你好运!
Norwaywoods
2003-03-29
打赏
举报
回复
那就好办了!你把jdom.jar放到C:\Program Files\Apache Group\Tomcat 4.1\webapps\axis\WEB-INF\lib\下面,就可以了!你光在系统的classpath里面设置是没用的!
如果这样还不行,我也没辙了!
huangry
2003-03-29
打赏
举报
回复
谢谢
可是我不是用的Jbuilder 我是直接在DOS下 用Javac 编译的 然后把这类放在了C:\Program Files\Apache Group\Tomcat 4.1\webapps\axis\WEB-INF\classes 下, jdom路径在环境变量里面也已经设置过了 555555555555
好惨~ 为什么你就可以:(
Norwaywoods
2003-03-28
打赏
举报
回复
最好的方法当然是:自己按照Apache Axis的要求写序列化和反序列化的方法:
如下:
XXXXXDeserializer,XXXXXSerializer,XXXXXDeserializerFactory,XXXXSerializerFactory
。但是在目前这种情况下,连Axis自己的用户文档上面都没有说清楚怎么做(http://cvs.apache.org/viewcvs.cgi/~checkout~/xml-axis/java/docs/user-guide.html#DataMapping)。只是叫用户自己去看例子。我觉得你要在短时间内写出来,也不太可能。我不是说过了吗?:
回复人: Norwaywoods() ( ) 信誉:100 2003-3-25 17:14:30 得分:100
JDom的序列化和WebService的序列化不是一回事的。Jdom的序列化应该是说他实现了java.io.Serializable这个接口。我说的是的序列化是指在包org.apache.axis.encoding.ser下面有相应的XXXXXDeserializer,XXXXXSerializer,XXXXXDeserializerFactory,XXXXSerializerFactory类。
具体的例子见\axis\samples\encoding。我也没做过,不过方向应该没错!如果你做出来了,给我一份,如何?呵呵!
所以,就老老实实的用String和"<![CDATA[" + XmlString + "]]>来做吧!
加载更多回复(18)
驯服Java线程
http://blog.csdn.net/
Norwaywoods
/
MATLAB矩阵和数组运算.ppt
MATLAB矩阵和数组运算.ppt
网络幼教资源的查找与利用课件ppt.ppt
网络幼教资源的查找与利用课件ppt.ppt
大学数学实验MATLAB简介.ppt
大学数学实验MATLAB简介.ppt
通信工程施工成本控制.ppt
通信工程施工成本控制.ppt
Java EE
67,550
社区成员
225,863
社区内容
发帖
与我相关
我的任务
Java EE
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
复制链接
扫一扫
分享
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章