dom4j解析soap xml

来源:互联网 发布:淘宝店能卖图片吗 编辑:程序博客网 时间:2024/04/29 14:10

做项目,客户给的webService接口,传入一个用户名,来获取数据。先用的

RPCServiceClient serviceClient = new RPCServiceClient();  Options options = serviceClient.getOptions(); EndpointReference targetEPR = new EndpointReference( "http://XXXXXXX");  options.setTo(targetEPR);  Object[] opAddEntryArgs = new Object[] {UserID}; Class[] classes = new Class[] {Task.class};//此处的Task为返回的对象  QName opAddEntry = new QName("http://XXXXX", "XXX");

但这样用一直报错。说预期的参数为{}UserID……,所以用了HttpClient方法,如下:

//此处的Document为dom4j的DocumentDocument responseStr = null;    //此处的userName就是需要传入的参数,XXX为targetNamespace,其他都是固定的        String soapRequestData=            "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:ust=\""+XXX+">\n" +                    "   <soapenv:Header/>\n" +                     "   <soapenv:Body>\n" +                     "      <ust:getNewTasks>\n" +                     "         <UserID>"+ userName +"</UserID>\n" +                     "      </ust:getNewTasks>\n" +                     "   </soapenv:Body>\n" +                     "</soapenv:Envelope>";        try {        //此处的url为webService接口,但不需要最后的/wsdl            responseStr=invokeWSMethod(soapRequestData, url,"urn:#getNewTasks");        } catch (Exception e) {            // TODO Auto-generated catch block            e.printStackTrace();        }

这样就返回了一个Document的xml数据,数据如下:

<?xml version="1.0" encoding="UTF-8"?><soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">    <soap:Body>        <ns2:root xmlns:ns2="http://www.ustcsoft.com">            <ns2:task>                <userid>myc</userid>                <custname>你好你好你好</custname>                <title>阿拉啦啦啦啦</title>                <nodename>金丝能接受是</nodename>                <recetime>201701160949</recetime>                <tasktype>1</tasktype>            </ns2:task>        </ns2:root>    </soap:Body></soap:Envelope>

此处的task就是要返回的对象,task可能有多个。经过查询之后找到这样一个方法:

public static List<Task> xmlToBean(Document doc) {        List<Task> returnTaskList = new ArrayList<Task>();        Task task = null;        doc.getText();        try{            String text = doc.asXML();            DefaultXPath xpath = new DefaultXPath("//ns2:task");            xpath.setNamespaceURIs(Collections.singletonMap("ns2","http://www.ustcsoft.com"));             //先获取所有的task            List<Element> list = xpath.selectNodes(doc);             if(list.size() > 0) {                for(int j=0; j<list.size(); j++) {                    task = new Task();                    //获取task下的所有子节点                    Element element = list.get(j);                    //遍历每一个子节点                    for(Iterator<Element> it = element.elementIterator(); it.hasNext();) {                        Element element2 = it.next();                        String name = element2.getName();                        String content = element2.getText();                        //下面的操作是因为每一个task我只需要custname、title、nodename这三个字段信息                        if("custname".equals(name)) {                            task.setCustname(content);                        } else if("title".equals(name)) {                            task.setTitle(content);                        } else if("nodename".equals(name)) {                            task.setNodename(content);                        }                    }                    returnTaskList.add(task);                }            }        }catch(Exception e) {            log.info("", e);        }        return returnTaskList;    }

这样就将一个soap的xml数据解析成为一个对象了。
【注:解析xml是从网上搜的方法,由于是几天前搜的,所以忘了地址。】

0 0