很简单,我有这样的数据,成千上万< 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正则表达式引擎中?
答案 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! - )。