关于Document对象的传输的问题,Norwaywoods() 请进

huangry 2003-03-27 01:19:44
你上次说如果要传输Document对象的话,只有两种方法。


但我想,既然Document对象是一个xml文档,是不是可以把root元素直接加入到我所要传输的SOAP信息中呢? 不知道您明白我的意思没有


这样可行吗? 可以直接写SOAP传送的那个XML结构吗?
...全文
173 38 打赏 收藏 转发到动态 举报
写回复
用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)
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧