我想使用RegExp从简单的XML文本SQL创建

时间:2009-06-26 13:20:16

标签: regex

很简单,我有这样的数据,成千上万< MigratedData>元素,通常我们使用XMLLoader应用程序加载它们,但现在这是一个特例,我必须使用映射自己更新数据库:

< MigratedData>     < migrationNr> 12123456< / migrationNr> < idOldSystem> 33398088801< / idOldSystem>   < / MigratedData>

< MigratedData>     < migrationNr> 6767< / migrationNr> < idOldSystem> 21100077878< / idOldSystem>   < / MigratedData>

< MigratedData>     < migrationNr> 767066< / migrationNr> < idOldSystem> 4545566767676< / idOldSystem>   < / MigratedData>

我将创建此类SQL语句:

  

更新table_1 t1设置t1.accountNr =   idOldSystem__Value__from_XML
      其中t1.id = migrationNr__from__XML;

是否存在一种简单的方法来实现这种与RegExp的对比,最好是在UltraEdit正则表达式引擎中?

2 个答案:

答案 0 :(得分:1)

为什么不在xml上使用简单的xslt转换并按照指定创建更新脚本?

让你的xml像这样

<?xml version="1.0" encoding="utf-8" ?>
<root>
    <MigratedData>
        <migrationNr>12123456</migrationNr>
        <idOldSystem>33398088801</idOldSystem>
    </MigratedData>
    <MigratedData>
        <migrationNr>6767</migrationNr>
        <idOldSystem>21100077878</idOldSystem>
    </MigratedData>
    <MigratedData>
        <migrationNr>767066</migrationNr>
        <idOldSystem>4545566767676</idOldSystem>
    </MigratedData>
</root>

并像这样应用XSLT:

<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:msxsl="urn:schemas-microsoft-com:xslt" exclude-result-prefixes="msxsl"
>
    <xsl:output method="text" indent="yes"/>

    <xsl:template match="MigratedData">
update table_1 t1 set t1.accountNr = <xsl:value-of select="./idOldSystem"/>
where t1.id =<xsl:value-of select="./migrationNr"/> ;

    </xsl:template>

</xsl:stylesheet>

您的结果将是

update table_1 t1 set t1.accountNr = 33398088801
where t1.id =12123456 ;
update table_1 t1 set t1.accountNr = 21100077878
where t1.id =6767 ;
update table_1 t1 set t1.accountNr = 4545566767676
where t1.id =767066 ;

答案 1 :(得分:1)

我没有UltraEdit(如果您希望答案严格限于该产品,您可能希望将其添加为标记),但在其他正则表达式上我可能会做(仅为了易读性添加换行符):

s/<MigratedData>\s*<migrationNr>(\d+)<\/migrationNr>\s*
  <idOldSystem>(\d+)<\/idOldSystem>\s*<\/MigratedData>/
  update table_1 t1 set t1.accountNr = \2 where t1.id = \1 ;

详细信息取决于您的特定正则表达式系统认为“魔术”的字符,即需要字面意义的反斜杠转义 - 这里我假设一个带有魔术字符的方言/作为分隔符,+和*表示重复,和圆括号形成组,所以我逃避斜线使它成为字面意思。

关键的想法是抓取非空数字序列(按字面顺序匹配其余部分,除了可选的空格以匹配为\s*)并将它们替换为替换文本,并使用反向引用两个组\1\2(替换中的反向引用的语法可能因方言而异,即,在您的特定上下文中可能需要$1$2有点可惜正则表达方言在它们之间变化很大,但是一般概念可以合理地重复使用(有点像SQL! - )。