向oracle中的xml文件添加标记(转换xml)
我有一张填写了“XmlInfo”的表格。此字段是varchar2,包含XML。 不要问为什么它是varchar2-这是旧的数据库结构 我需要在这个xml中“添加”一个标记。 所以我使用了xmltype.createXML和APPENDCHILDXML的组合。问题在于输出 原始字段没有缩进。所以首先我使用带有“无缩进”选项的xmlserialize。不幸的是,这只在Oracle11中可用,我需要在Oracle10和Oracle11上执行此查询 所以我使用变换。但我还是被卡住了 原始值:向oracle中的xml文件添加标记(转换xml),xml,oracle,transform,xmltype,Xml,Oracle,Transform,Xmltype,我有一张填写了“XmlInfo”的表格。此字段是varchar2,包含XML。 不要问为什么它是varchar2-这是旧的数据库结构 我需要在这个xml中“添加”一个标记。 所以我使用了xmltype.createXML和APPENDCHILDXML的组合。问题在于输出 原始字段没有缩进。所以首先我使用带有“无缩进”选项的xmlserialize。不幸的是,这只在Oracle11中可用,我需要在Oracle10和Oracle11上执行此查询 所以我使用变换。但我还是被卡住了 原始值: <i
<info><Managed>False</Managed></info>
<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>
<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>
<info>
<Managed>False</Managed>
<ChangedDate>2013-09-11</ChangedDate>
</info>
False
期望值:
<info><Managed>False</Managed></info>
<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>
<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>
<info>
<Managed>False</Managed>
<ChangedDate>2013-09-11</ChangedDate>
</info>
false 2013-09-11
我使用这个查询
select xmltype.createXML(t1.XmlInfo).APPENDCHILDXML('//info',XMLTYPE.CREATEXML('<ChangedDate>'|| to_char(sysdate, 'yyyy-mm-dd') ||'</ChangedDate>'))
.transform(xmltype(
'<?xml version="1.0"?><xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"><xsl:output omit-xml-declaration="yes" indent="no"/><xsl:template match="@*|node()"><xsl:copy><xsl:apply-templates select="@*|node()"/></xsl:copy></xsl:template></xsl:stylesheet>'
)).getStringVal()
from table1 t1
选择xmltype.createXML(t1.XmlInfo).APPENDCHILDXML('//info',xmltype.createXML(''| | | to_char(sysdate,'yyyyy-mm-dd')|'')
.transform(xmltype)(
''
)).getStringVal()
来自表1 t1
产生Oracle 11(如预期的那样):
<info><Managed>False</Managed></info>
<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>
<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>
<info>
<Managed>False</Managed>
<ChangedDate>2013-09-11</ChangedDate>
</info>
false 2013-09-11
生成Oracle 10(有新行字符):
<info><Managed>False</Managed></info>
<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>
<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>
<info>
<Managed>False</Managed>
<ChangedDate>2013-09-11</ChangedDate>
</info>
假的
2013-09-11
这种转换有什么问题,或者是否有任何方法可以编写此查询并在两个版本的oracle中按预期工作 备注:
在下一步中,我必须更新这个值,所以我将使用“updatexml”。这就是为什么我不能直接连接两个字符串。有什么问题吗?无论如何,您只需将其放回VARCHAR2中,这样您就可以通过一个简单的REGEX_替换来去除缩进,该替换匹配标记之间的[:space:]类;比如:
REGEXP_REPLACE(indentedxml, ">[[:space:]]+<", "><")
REGEXP\u REPLACE(indentedxml,”>[[:space:]+我通过完全删除xml引擎并使用纯文本解决了这个问题。。。
通过组合substr
、instr
和case
语句,我创建了难看、晦涩的SQL,在特定位置注入正确的日期。
取决于此节点中是否存在ChangedDate字符串和旧值。
这是一种解决方法,所以我将问题标记为已回答。但如果有人知道缩进问题的真正答案,请告诉我。因为下一次更新可能不太容易用字符串函数处理…它不容易使用,但如果需要生成XML的特定表示形式,它是正确的运算符。对我来说-缩进ion与此无关,但我们使用的第三个软件在括号之间的位置丢失:/Second:您的示例将空格作为标记值删除(例如
)。