dom4j解析mybatis的xml文件怎样把大于号以及if标签都能解析出来?
1. 需求,读取指定mybatis的mapper文件的<select>或者 <insert> 等节点当中的问题;
2. 思考分析 :
首先,第一步我们需要得到这个节点的内容,那如何得到呢?肯定需要从文件当中去读取,需要借助dom4j来遍历xml文档对象从而
匹配到指定的 select_id 或者 insert_id 的内容。
然后,其实还有坑,得到了 Element对象并不意味着我们就能完整的得到当中的内容,比如 xml当中的大于号 都是被转移成 > 了,
若我们强制所有的都转可能出问题,若不转给前端展示还是不对,而且select 当中的 if这种标签呢? 其实我们想要的效果就是正常的一个sql
原样展现,这里的问题归结为 -》 格式问题。
3. 代码 实现 :
3.1 首先,我们写一个 Util类,里面写一个静态方法,其传参为 String path ,也就是 告知这个方法 我们要找的xml是这个,然后返回Document
对象 :
package root.report.util; import java.io.File; import java.io.InputStream; import java.net.URL; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; import org.xml.sax.SAXException; public class XmlUtil { //解析指定路径下xml文件 public static Document parseXmlToDom(String sqlPath) throws SAXException, DocumentException { SAXReader reader = new SAXReader(); reader.setValidation(false); reader.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false); return reader.read(new File(sqlPath)); } }
3.2 下一步,我们得到dom文档当中指定的节点,比如我们得到 select 节点,其id为 aaa等 :
Document userDoc = null; userDoc = XmlUtil.parseXmlToDom(userSqlPath); Element select = (Element)userDoc.selectSingleNode("//select[@id='"+sqlId+"']");
3.3 下一步, 得到里面的所有节点信息 ,然后解析出来

代码 :
/** * 功能描述: 得到指定文件指定id的 sql内容 ,若bool为true则代表保留原格式,为false则代表只要sql不要转义 */ public String getSqlTemplate(String TemplateName, String SelectID, Boolean bool) throws DocumentException, SAXException { String namespace = TemplateName; String sqlId = SelectID; String userSqlPath = AppConstants.getUserSqlPath() + File.separator + AppConstants.QueryPrefix + namespace + ".xml"; OutputFormat format = OutputFormat.createPrettyPrint(); format.setSuppressDeclaration(true); format.setIndentSize(2); format.setNewlines(true); format.setTrimText(false); XMLWriter writer = null; Document userDoc = null; try { userDoc = XmlUtil.parseXmlToDom(userSqlPath); Element select = (Element) userDoc.selectSingleNode("//select[@id='" + sqlId + "']"); String tempStr = ""; if (bool) { // tempStr = select.getStringValue(); // 按照原格式取出 List<Object> list = select.content(); Object object = null; DefaultComment selContent = null; DefaultCDATA selCdata = null; for (int i = 0; i < list.size(); i++) { object = list.get(i); if (object instanceof DefaultComment) { selContent = (DefaultComment) object; // obj.put("comment", JSON.parse(selContent.getText())); }else{ tempStr+=((Node)object).asXML(); } } } else { tempStr = select.getTextTrim(); // 编译了一些html代码,导致不是原格式了,输入无格式的sql } log.debug("获取到的SQL为:" + tempStr); return tempStr; } catch (java.lang.Exception e) { throw e; } }
好了,效果展示如下,我使用的是postman测试的 :


浙公网安备 33010602011771号