【DOM(Document Object Model) 】
由W3C提供的接口,它将整个XML文档读入内存,构建一个DOM树来对各个节点(Node)进行操作。
下面是具体的代码实现:
/**
* 解析发送短信返回的XML信息
*
* @param returnMsg - xml格式
* @return
*/
private List<SMSReturnResultMsg> parseSendReturnXml(String xmlMsg) throws Exception{
SMSReturnResultMsg smsReturnMsgDto = null;
List<SMSReturnResultMsg> resultList = new ArrayList<SMSReturnResultMsg>();
try{
InputStream is = new ByteArrayInputStream(xmlMsg.getBytes("UTF-8"));
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder docBuilder = factory.newDocumentBuilder();
Document doc = docBuilder.parse(is);
Element root = doc.getDocumentElement();
//获取属性指定属性值
String name = root.getAttribute("name");
String resultMsg = SMSUtils.getSMSReturnStatusMsg(Integer.valueOf(root.getAttribute("result")));
//获取子元素
NodeList childNode = root.getChildNodes();
if(childNode != null && childNode.getLength() > 0){//子元素存在
for(int i = 0; i < childNode.getLength(); i ++){
smsReturnMsgDto = new SMSReturnResultMsg();
smsReturnMsgDto.setActionName(name);//actionName
smsReturnMsgDto.setReturnStatus(resultMsg);//returnStatus
smsReturnMsgDto.setCid(childNode.item(i).getAttributes().getNamedItem("cid").getNodeValue());//cid
smsReturnMsgDto.setSid(childNode.item(i).getAttributes().getNamedItem("sid").getNodeValue());//sid
smsReturnMsgDto.setMsgid(childNode.item(i).getAttributes().getNamedItem("msgid").getNodeValue());//msgid
smsReturnMsgDto.setSmsTotal(childNode.item(i).getAttributes().getNamedItem("total").getNodeValue());//smsTotal
smsReturnMsgDto.setUnitPrice(childNode.item(i).getAttributes().getNamedItem("price").getNodeValue());//unitFee
smsReturnMsgDto.setCurrentRemain(childNode.item(i).getAttributes().getNamedItem("remain").getNodeValue());//currentRemain
resultList.add(smsReturnMsgDto);
}
}else{//子元素不存在将根元素返回
smsReturnMsgDto = new SMSReturnResultMsg();
smsReturnMsgDto.setActionName(name);//actionName
smsReturnMsgDto.setReturnStatus(resultMsg);//returnStatus
resultList.add(smsReturnMsgDto);
}
}catch(Exception e){
logger.error("Exception happened in SMSServiceImpl.parseSendReturnXml(), the xmlMsg: "+ xmlMsg +"; the error msg is " + e.getMessage());
throw e;
}
return resultList;
}