本人现在本人在做一个小的项目测试,然后现在客户端已经可以获得服务器传过来的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有错误,也就是这一块块的开始错误。帮看看吧。卡了挺久的了。这些就取了几个元素。
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有错误,也就是这一块块的开始错误。帮看看吧。卡了挺久的了。这些就取了几个元素。
解决方案
100
回答你的第二个问题吧,第一个格式太乱,内容多,不想看。
利用Axis2发布webservice服务不一定非要是xml格式,主要看你服务端定义的是什么,客户端根据你的定义来封装请求参数,然后得到你指定的返回结果,本人给你个简化的案例,我们项目中就是这么做的:
首先:发布流程啥的你应该知道的,本人就直接说几个暴露在指定类的方法
服务端:
利用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,也就不分那么多了。