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();