一种:不带名称空间的XML,可以直接用xapth表达式解析
1 Document document = DocumentHelper.parseText(resultXML); 2 Element ele = (Element) document.selectSingleNode("/CUSTINFORESPONSE/MSGBODY");
二种:带名称空间的xml
<?xml version="1.0" encoding="utf-8"?> <BFSREQUEST xmlns="http://impl.webservice.ocs.sunrise.com"> <MSGHEADER> <MSGTYPE>31</MSGTYPE> <RECORDTYPE>956</RECORDTYPE> <VERSION>01</VERSION> </MSGHEADER> <MSGBODY> </MSGBODY> </BFSREQUEST>
比如这种,这种带名称空间的,可以将xml读成字符串后,将xmlns="http://impl.webservice.ocs.sunrise.com"部分,用空格替换掉,就可以用xpath正常解析。
三种:带名称空间的
<?xml version="1.0" encoding="utf-8"?> <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <ns0:qryUserActivityResponse xmlns:ns0="http://qryactionservice2.service.protocol.cxf.linkage.com/"> <qryUserActivityRSP>
如果是这种带名称空间的,用第二种方法就不好搞了,我反正是没试出来。这样的麻烦些。
Document document = DocumentHelper.parseText(result); Map<String, String> spaceMap = new HashMap<>(); spaceMap.put("soap", "http://schemas.xmlsoap.org/soap/envelope/"); spaceMap.put("ns0", "http://qryactionservice2.service.protocol.cxf.linkage.com/"); XPath codeXpath = document.createXPath("soap:Envelope//RSP_CODE"); codeXpath.setNamespaceURIs(spaceMap); Node resultCode = codeXpath.selectSingleNode(document);
这种要创建利用名称空间创建xpath对象,但是要注意的是,在些xpath表达式时,要带上名称空间的别名。例如
"soap:Envelope//RSP_CODE"
具体原理没研究,就是记录过程。