package UIB.COM; import java.util.HashMap; import java.util.Iterator; import java.util.Map; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; /** * * @desc 对具体指定的XML文件进行解析,获取SQL及对应ID。 * xml文档解析,服务器启动时执行,循环读取XML文件,并逐一将SQL解析出来并按照key-value的形式存放在hashmap中 * @author meiguiping * @date 2010 12:38:36 PM */ public class XgDomParser implements IXMLParser { /** * @desc 加载XML文件 * @param element * @param sqlID * @return */ public HashMap parserEl(Element element) { if(element == null) { System.out.println("XML文件获取失败!"); return null; } //解析xml HashMap hm = loadElement(element); return hm; } /** * @desc 废弃 * @deprecated */ public HashMap parserSq(Element element , String sqlID) { if(element == null) { System.out.println("XML文件获取失败!"); return null; } else if("".equals(sqlID.trim())) { System.out.println("sqlID为空!"); return null; } HashMap hm = loadSqlID(element, sqlID); return hm; } /** * @desc 解析XML文件,获取所有SQL,按照KEY-VALUE的形式存放 * @param element * @return */ private HashMap loadElement(Element element) { HashMap hashmap = new HashMap(); String reg="--[\\w\\W]+?\n"; if (element.hasChildNodes()) { NodeList nodelist = element.getChildNodes(); int j = nodelist.getLength(); for(int i = 0 ; i< j; i++) { Node node = nodelist.item(i); if(node.getNodeType() == Node.CDATA_SECTION_NODE) //CDATA段 { String sqlid = node.getParentNode().getAttributes().getNamedItem("id").getNodeValue(); if(!"".equals(node.getNodeValue().trim()))//可不判断 hashmap.put(sqlid, node.getNodeValue().trim().replaceAll(reg, "")); continue; } if(node.getNodeType() == Node.TEXT_NODE)//TEXT { if(node.getParentNode().getAttributes().getNamedItem("id") == null) continue; String sqlid = node.getParentNode().getAttributes().getNamedItem("id").getNodeValue(); if(!"".equals(node.getNodeValue().trim()))//必须判断 hashmap.put(sqlid, node.getNodeValue().trim().replaceAll(reg, "")); continue; } if(node.getNodeType()==Node.ELEMENT_NODE)//ELEMENT { Element e = (Element)nodelist.item(i); Map map = loadElement(e); if(map.size() > 0) { Iterator it = map.keySet().iterator(); while(it.hasNext()) { Object key = it.next(); Object value = map.get(key); hashmap.put(key , value); } } } } } return hashmap; } /** * @desc 每次执行均需从磁盘读取,废弃 * @param element * @param sqlID * @deprecated * @return */ private HashMap loadSqlID(Element element , String sqlID) { HashMap hashmap = new HashMap(); if (element.hasChildNodes()) { NodeList nodelist = element.getChildNodes(); int j = nodelist.getLength(); for(int i = 0 ; i< j; i++) { Node node = nodelist.item(i); if(node.getNodeType() == Node.CDATA_SECTION_NODE) //CDATA段 { String sqlid = node.getParentNode().getAttributes().getNamedItem("id").getNodeValue(); if(sqlid.equals(sqlID)) { if(!"".equals(node.getNodeValue().trim()))//可不判断 hashmap.put(sqlid, node.getNodeValue().trim()); continue; } } if(node.getNodeType() == Node.TEXT_NODE)//TEXT { if(node.getParentNode().getAttributes().getNamedItem("id") == null) continue; String sqlid = node.getParentNode().getAttributes().getNamedItem("id").getNodeValue(); if(sqlid.equals(sqlID)) { if(!"".equals(node.getNodeValue().trim()))//必须判断 hashmap.put(sqlid, node.getNodeValue().trim()); continue; } } if(node.getNodeType()==Node.ELEMENT_NODE)//ELEMENT { Element e = (Element)nodelist.item(i); Map map = loadSqlID(e , sqlID); if(map.size() > 0) hashmap.put(sqlID , map.get(sqlID)); } } } return hashmap; } }