我正在尝试将XML文件转换为Eclipse中的SQL语句,以节省转换大型文件的手动工作。
如下的行:
<TABLE_NAME COL_1="value1" COL_2="value2"/>
应转换为:
insert into TABLE_NAME (COL_1, COL_2) values ("value1", "value2");
到目前为止,我已设法匹配并捕获表名和第一列/值对:
<(\w+)( \w+)=(".+?").*/>
接近结尾的.*
就是测试模式的第一部分,一旦完成就应该删除。
以下替换模式会产生以下结果:
insert into $1 ($2) values ($3);
insert into TABLE_NAME ( COL_1) values ("value1");
我遇到的问题是不同表的列数不同,所以我想要一个匹配 n 列/值对的通用模式,并重复使用捕获的组替换模式。我还没有设法理解如何做到这一点,尽管\G
似乎是一个很好的候选人。
理想情况下,这可以在单个regexp语句中解决,但我也不会反对必须按顺序运行的多个语句(尽管我真的不想强迫开发人员执行一次每列/值对。)
有人有什么想法吗?
答案 0 :(得分:0)
我最终没有用最初设想的正则表达式来解决这个问题。考虑到替代解决方案,最终通过重新分解测试代码以使其可重复使用,然后选择dbunit以使用测试将数据写入开发数据库的不同阶段来解决它。 / p>
我知道这是对测试的误用,但它确实使整个事情变得更加简单,因为用户得到关于数据是否插入的绿色/红色反馈,并且可以插入相同的测试数据用于手动验证测试用于自动化组件/集成测试(使用dbunit与内存数据库)。只要这些假测试类没有添加到测试套件中,那么它们只能手工执行。
由此产生的假测试最终变得非常简单和轻量级,例如:
public class MyComponentTestDataInserter extends DataInserter {
@Override
protected String getDeleteSql() {
return "./input/component/delete.sql";
}
@Override
protected String getInsertXml() {
return "./input/component/TestData.xml";
}
@Test
public void insertIntoDevStage() {
insertData(Environment.DEV);
}
@Test
public void insertIntoTestStage() {
insertData(Environment.TEST);
}
}
这还有一个额外的好处,即开发人员只需通过IDE中的上下文菜单执行单个测试方法,即可将数据插入到单个环境中。同时,通过运行整个测试类,可以将完全相同的数据同时部署到所有环境。
此外,在数据清理或插入过程中的任何时候发生故障都会导致整个事务回滚,从而防止状态不一致。