调用WebService获得基于SOAP的XML,怎么解析获得节点的属性和值?

zp7833377 2016-08-29 02:11:23
我现在自己在做一个小的项目测试,然后现在客户端已经可以获得服务器传过来的XML的字符串消息。方法什么的都是自己写的。现在是要获得节点里面的属性名和属性值,因为要在一个APP中显示出来,我这个只是测试的一个JAVA程序。到时是要写到Android里面的。所以是要获取这些值。 但是今天试了两个方法都报错。这边是其中一种方法,报的错都一样,所以应该不是方法问题。
ByteArrayInputStream inputStream = new ByteArrayInputStream(r.getBytes());
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder db = factory.newDocumentBuilder();
org.w3c.dom.Document document = db.parse(inputStream);

NodeList node = document.getElementsByTagName("row");
for(int i = 0 ; i < node.getLength();i++){
org.jdom2.Element element = (Element)node.item(i);
String content = element.getAttributeValue("address");
System.out.println(content);
}
用的是这个方法。然后还有一种SAXReader的方法也试用过。 都是同样的报错:
Exception in thread "main" org.dom4j.DocumentException: Error on line 21 of document : 元素类型 "row" 必须后跟属性规范 ">" 或 "/>"。 Nested exception: 元素类型 "row" 必须后跟属性规范 ">" 或 "/>"。
错误信息有用的就这一行。 然后我的那个字符串,就是XML类型的字符串是以下内容:
<?xml version="1.0" encoding="GBK"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<soap:Header><out:system xmlns:out="http://www.xxx.com/">
</out:system></soap:Header>
<soap:Body>
<out:business xmlns:out="http://www.xxx.com/">
<result showtype="2"/>
<resultset name="structs">
<row label="医院编号" columnname="hospitalid" typename="Varchar2" />
<row label="地址" columnname="address" typename="Varchar2" />
<row label="可否预约" columnname="canappoint" typename="Varchar2" />
<row label="部门编号" columnname="deptcode" typename="Varchar2" />
<row label="医生" columnname="deptdoctors" typename="Varchar2" />
<row label="科室名称" columnname="outpatientofficename" typename="Varchar2" />
<row label="父级编号" columnname="parentId" typename="Varchar2" />
<row label="备注" columnname="remark" typename="Varchar2" />

</resultset>
<resultset name="retrieve"><row hospitalid="1"
address="外环路"
canappoint="1"
deptcode="1"
deptdoctors="李一"
outpatientofficename="外科"
parentId="0"
remark="测试"
/>
<row hospitalid="1"
address="外环路"
canappoint="1"
deptcode="2"
deptdoctors="王大陆"
outpatientofficename="骨科"
parentId="0"
remark="测试"
/>
</resultset>
</out:business>
</soap:Body>
</soap:Envelope>
错误信息里面说21行的row有错误,也就是这一块块的开始错误。帮忙看看吧。卡了挺久的了。这些就取了几个元素。
...全文
1594 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
zp7833377 2016-09-07
  • 打赏
  • 举报
回复
引用 5 楼 u013185616 的回复:
[quote=引用 4 楼 zp7833377 的回复:] 首先谢谢你的回答。其实上面就是很简单的一个格式。 <resultset name="structs"> <row label="医院编号" columnname="hospitalid" typename="Varchar2" /> </resultset> 这边是打印出每个标签的名字。 <row hospitalid="1" address="外环路" canappoint="1" deptcode="2" deptdoctors="王大陆" outpatientofficename="骨科" parentId="0" remark="测试" /> 这边就是每个信息了。就是我需要的数据,就是这些属性后面的值,比如说address="外环路"我就是需要通过这个address属性,来获得它的这个值,外环路,一次类推。然后每个row算是一个个体,然后因为我客户端是在Android,所以每个实体我放在一个控件里实现。 好的。我会看看。现在我的客户端是做在Android端,出现了一点问题。 能帮忙看看嘛?弄了一个早上了已经。 我用的是自己写的代码,来实现调用,本来做得App没问题。到做客户端的时候,就是调用的时候,引入了几个包,就开始出问题了。懂得是为什么嘛? Error:Execution failed for task ':app:transformClassesWithDexForDebug'. > com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 1
安卓没做过,你这个报错是不是jar包冲突了?你看看这个 http://blog.csdn.net/u012911063/article/details/50013551[/quote] 现在这个错误处理来处理去。我都晕头转向,刚把老的问题解决了,又出现新的问题了。 感谢你的热心解答。我找我同事再问问,他们是怎么处理这些字符串的。
I,Frankenstein 2016-09-06
  • 打赏
  • 举报
回复
引用 4 楼 zp7833377 的回复:
首先谢谢你的回答。其实上面就是很简单的一个格式。

<resultset name="structs">
<row label="医院编号" columnname="hospitalid" typename="Varchar2" />
</resultset>
这边是打印出每个标签的名字。

<row hospitalid="1"
address="外环路"
canappoint="1"
deptcode="2"
deptdoctors="王大陆"
outpatientofficename="骨科"
parentId="0"
remark="测试"
/>
这边就是每个信息了。就是我需要的数据,就是这些属性后面的值,比如说address="外环路"我就是需要通过这个address属性,来获得它的这个值,外环路,一次类推。然后每个row算是一个个体,然后因为我客户端是在Android,所以每个实体我放在一个控件里实现。

好的。我会看看。现在我的客户端是做在Android端,出现了一点问题。 能帮忙看看嘛?弄了一个早上了已经。
我用的是自己写的代码,来实现调用,本来做得App没问题。到做客户端的时候,就是调用的时候,引入了几个包,就开始出问题了。懂得是为什么嘛?
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 1


安卓没做过,你这个报错是不是jar包冲突了?你看看这个 http://blog.csdn.net/u012911063/article/details/50013551
zp7833377 2016-09-06
  • 打赏
  • 举报
回复
引用 3 楼 u013185616 的回复:
回答你的第二个问题吧,第一个格式太乱,内容多,不想看。 利用Axis2发布webservice服务不一定非要是xml格式,主要看你服务端定义的是什么,客户端根据你的定义来封装请求参数,然后得到你指定的返回结果,我给你个简化的案例,我们项目中就是这么做的: 首先:发布流程啥的你应该知道的,我就直接说几个暴露在指定类的方法 服务端:
public LoginResult userLogin(String Ip, int Port, String userName, String userPwd){
		return xxxService.userLogin(Ip, Port, userName, userPwd);
	}
我们看这个方法,这个当时是做webservice登录系统的,入参是几个String类型的数据,返回的是一个叫LoginResult的类,这里我们叫它“结构体”,这个里面就是我们常见的返回结果的定义,来简单看下
public class LoginResult {	
	//登录结果
	private boolean result;
	// 错误号
	private int errorCode;
	// 用户登录票据
	private String tgt;
       //setter、getter
	
那么我们在服务端定义好了,入参是String数组,返回的是一个结构体。 那么我们知道:webservice服务的好处就是可以跨平台,我不管谁来调用,只要给我指定的参数,我就给你返回结果。那么我举个用Java来调用的吧,看下我这个博客,我写了怎么用axis2+MyEclipse来生成客户端:http://blog.csdn.net/u013185616/article/details/51822170 我们就可以通过生成的客户端代码去调用指定的方法。 当然,xml的形式是主流,因为这样的结构体可能会限制一些语言或者平台,根据需要吧,因为我们暴露的这个服务是给自己的子系统用的,都是Java,也就不分那么多了。
首先谢谢你的回答。其实上面就是很简单的一个格式。 <resultset name="structs"> <row label="医院编号" columnname="hospitalid" typename="Varchar2" /> </resultset> 这边是打印出每个标签的名字。 <row hospitalid="1" address="外环路" canappoint="1" deptcode="2" deptdoctors="王大陆" outpatientofficename="骨科" parentId="0" remark="测试" /> 这边就是每个信息了。就是我需要的数据,就是这些属性后面的值,比如说address="外环路"我就是需要通过这个address属性,来获得它的这个值,外环路,一次类推。然后每个row算是一个个体,然后因为我客户端是在Android,所以每个实体我放在一个控件里实现。 好的。我会看看。现在我的客户端是做在Android端,出现了一点问题。 能帮忙看看嘛?弄了一个早上了已经。 我用的是自己写的代码,来实现调用,本来做得App没问题。到做客户端的时候,就是调用的时候,引入了几个包,就开始出问题了。懂得是为什么嘛? Error:Execution failed for task ':app:transformClassesWithDexForDebug'. > com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command 'D:\Java\jdk1.8.0_60\bin\java.exe'' finished with non-zero exit value 1
I,Frankenstein 2016-09-02
  • 打赏
  • 举报
回复
回答你的第二个问题吧,第一个格式太乱,内容多,不想看。 利用Axis2发布webservice服务不一定非要是xml格式,主要看你服务端定义的是什么,客户端根据你的定义来封装请求参数,然后得到你指定的返回结果,我给你个简化的案例,我们项目中就是这么做的: 首先:发布流程啥的你应该知道的,我就直接说几个暴露在指定类的方法 服务端:
public LoginResult userLogin(String Ip, int Port, String userName, String userPwd){
		return xxxService.userLogin(Ip, Port, userName, userPwd);
	}
我们看这个方法,这个当时是做webservice登录系统的,入参是几个String类型的数据,返回的是一个叫LoginResult的类,这里我们叫它“结构体”,这个里面就是我们常见的返回结果的定义,来简单看下
public class LoginResult {	
	//登录结果
	private boolean result;
	// 错误号
	private int errorCode;
	// 用户登录票据
	private String tgt;
       //setter、getter
	
那么我们在服务端定义好了,入参是String数组,返回的是一个结构体。 那么我们知道:webservice服务的好处就是可以跨平台,我不管谁来调用,只要给我指定的参数,我就给你返回结果。那么我举个用Java来调用的吧,看下我这个博客,我写了怎么用axis2+MyEclipse来生成客户端:http://blog.csdn.net/u013185616/article/details/51822170 我们就可以通过生成的客户端代码去调用指定的方法。 当然,xml的形式是主流,因为这样的结构体可能会限制一些语言或者平台,根据需要吧,因为我们暴露的这个服务是给自己的子系统用的,都是Java,也就不分那么多了。
zp7833377 2016-09-02
  • 打赏
  • 举报
回复
没有人帮忙看看嘛。
zp7833377 2016-08-29
  • 打赏
  • 举报
回复
对了,我还想问问,就是整个的流程是怎么样的?利用Axis2发布服务和客户端调用服务的过程。如果不封装成一个基于soap的XML文件可以传送吗?我现在是只要写服务端,有现成的封装类,将要传递的数据打包成一个基于SOAP的XML文件。如果只是一个普通的字符串,可以进行传递嘛?在客户端能够接收的到吗? 顺便一提,我上面获取的是一个字符串,因为执行客户端的调用方法后获得的是一段字符串。

67,550

社区成员

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

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