使用dom4j处理kettlle生成的xml文件

dom4j介绍:https://dom4j.github.io/

dom4j支持xpath:xpath语法:http://www.w3school.com.cn/xpath/index.asp

写这个主要是看网络上那些文章太乱了,dom4j本身已经很简单了,最主要是注意:

  • Element能包括更多的东西,相当于更完整的一段xml代码
  • Node只是结构上的一个节点。Element是Node的子类。其中Document也是Node的子类。

 

以下算是一个比较简单的入门案例,包括了查找、修改,如果文档不是很大,使用没有任何问题。

 

需求:有130多个trans文件(也是代码生成),需要整合到一个job里面,太多了,人工出错概率太大。

所以先通过spoon来生成一个job文件(主要是看job的xml文件语法结构),通过以这个问模版,用代码把所有trans文件都汇总。

处理逻辑:

  • 以类型来搜索,替换transformation的坐标,
  • hops用于连接transz

最终完成效果,把提供的tran文件,汇总成一个kjb文件。如图:

//还有一种DOM读取方式    
SAXReader reader = new SAXReader();
        Document doc = reader.read(new File("D:\\IdeaProjects\\ContentHelp\\src\\main\\resources\\health_db.kjb"));

        Node node = doc.selectSingleNode("//job/name");
        node.setText("dbName");

        Element entries = (Element) doc.selectSingleNode("//job/entries");
        List<Node> redundanceEntrys = entries.selectNodes("./entry[type='TRANS']");

        for (Node redEntry : redundanceEntrys) {
            entries.remove(redEntry);
        }

        //xpath语法,其中.代表当前节点,从当前节点往下,则以.开始,还有一个//,不局限当前
        Node start_x = entries.selectSingleNode("./entry[type = 'SPECIAL']/xloc");
        start_x.setText(String.valueOf(START_XLOC));
        Node  start_y = entries.selectSingleNode("./entry[type = 'SPECIAL']/yloc");
        start_y.setText(String.valueOf(START_YLOC));

        Node SET_VARIABLES_x = entries.selectSingleNode("./entry[type = 'SET_VARIABLES']/xloc");
        SET_VARIABLES_x.setText(String.valueOf(SET_VARIABLES_XLOC));
        Node  SET_VARIABLES_y = entries.selectSingleNode("./entry[type = 'SET_VARIABLES']/yloc");
        SET_VARIABLES_y.setText(String.valueOf(SET_VARIABLES_YLOC));

        Node SUCCESS_x = entries.selectSingleNode("./entry[type = 'SUCCESS']/xloc");
        SUCCESS_x.setText(String.valueOf(SUCCESS_XLOC));
        Node  SUCCESS_y = entries.selectSingleNode("./entry[type = 'SUCCESS']/yloc");
        SUCCESS_y.setText(String.valueOf(SUCCESS_YLOC));


        Element hops = (Element) doc.selectSingleNode("//job/hops");
        List<Node> redHops = hops.selectNodes("./hop[from != 'START']");
        for (Node redHop : redHops) {
            hops.remove(redHop);
        }

        File[] files = kettleHelper(path);
        for (int i = 0; i < files.length; i++) {
            String tableName = files[i].getName().split("\\.")[0];
            String fileName = files[i].getName();
            int y = (10 + i * ENTRY_YLOC_STEP);
            String entry = "<entry>" +
                    "      <name>" + tableName + "</name>" +
                    "      <description />" +
                    "      <type>TRANS</type>" +
                    "      <specification_method>filename</specification_method>" +
                    "      <trans_object_id />" +
                    "      <filename>${Internal.Entry.Current.Directory}/" + fileName + "</filename>" +
                    "      <transname />" +
                    "      <arg_from_previous>N</arg_from_previous>" +
                    "      <params_from_previous>N</params_from_previous>" +
                    "      <exec_per_row>N</exec_per_row>" +
                    "      <clear_rows>N</clear_rows>" +
                    "      <clear_files>N</clear_files>" +
                    "      <set_logfile>N</set_logfile>" +
                    "      <logfile />" +
                    "      <logext />" +
                    "      <add_date>N</add_date>" +
                    "      <add_time>N</add_time>" +
                    "      <loglevel>Basic</loglevel>" +
                    "      <cluster>N</cluster>" +
                    "      <slave_server_name />" +
                    "      <set_append_logfile>N</set_append_logfile>" +
                    "      <wait_until_finished>Y</wait_until_finished>" +
                    "      <follow_abort_remote>N</follow_abort_remote>" +
                    "      <create_parent_folder>N</create_parent_folder>" +
                    "      <logging_remote_work>N</logging_remote_work>" +
                    "      <run_configuration>Pentaho local</run_configuration>" +
                    "      <parameters>" +
                    "        <pass_all_parameters>Y</pass_all_parameters>" +
                    "      </parameters>" +
                    "      <parallel>N</parallel>" +
                    "      <draw>Y</draw>" +
                    "      <nr>0</nr>" +
                    "      <xloc>"+ENTRY_XLOC+"</xloc>" +
                    "      <yloc>" + y + "</yloc>" +
                    "    </entry>";

            Document entryDocument = DocumentHelper.parseText(entry);
            //不能直接添加Document
            Element entryDocumentRootElement = entryDocument.getRootElement();

            entries.add(entryDocumentRootElement);
            //String转xml,必须遵循xml语法,比如如下2个合并在一起,则没有一个大的标签,所以分开2段
            String hop_from = " <hop>" +
                    "      <from>设置变量</from>" +
                    "      <to>" + tableName + "</to>" +
                    "      <from_nr>0</from_nr>" +
                    "      <to_nr>0</to_nr>" +
                    "      <enabled>Y</enabled>" +
                    "      <evaluation>Y</evaluation>" +
                    "      <unconditional>N</unconditional>" +
                    "    </hop>";
            String hop_to =
                    "    <hop>" +
                            "      <from>" + tableName + "</from>" +
                            "      <to>成功</to>" +
                            "      <from_nr>0</from_nr>" +
                            "      <to_nr>0</to_nr>" +
                            "      <enabled>Y</enabled>" +
                            "      <evaluation>Y</evaluation>" +
                            "      <unconditional>N</unconditional>" +
                            "    </hop>";

            Document hop_from_doc = DocumentHelper.parseText(hop_from);
            Document hop_to_doc = DocumentHelper.parseText(hop_to);

            Element hop_from_docRootElement = hop_from_doc.getRootElement();
            Element hop_to_docRootElement = hop_to_doc.getRootElement();

            hops.add(hop_from_docRootElement);
            hops.add(hop_to_docRootElement);
        }
        //输出格式化有2种,一种是按照缩进,一种是压缩,就是没有任何缩进
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        String kjbFile = path+"\\" + dbName+".kjb";
        XMLWriter xmlWriter = new XMLWriter(new FileWriter(kjbFile), outputFormat);
        xmlWriter.write(doc);
        xmlWriter.flush();
        xmlWriter.close();

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值