dom4j解析mybatis的xml文件怎样把大于号以及if标签都能解析出来?

1. 需求,读取指定mybatis的mapper文件的<select>或者 <insert> 等节点当中的问题;

2. 思考分析 : 

  首先,第一步我们需要得到这个节点的内容,那如何得到呢?肯定需要从文件当中去读取,需要借助dom4j来遍历xml文档对象从而

 匹配到指定的 select_id 或者 insert_id  的内容。

       然后,其实还有坑,得到了 Element对象并不意味着我们就能完整的得到当中的内容,比如 xml当中的大于号 都是被转移成     &gt; 了,

若我们强制所有的都转可能出问题,若不转给前端展示还是不对,而且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测试的 : 

  

 

posted @ 2018-11-01 14:42  白云是世界的公民  阅读(764)  评论(0)    收藏  举报