Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
向oracle中的xml文件添加标记(转换xml)_Xml_Oracle_Transform_Xmltype - Fatal编程技术网

向oracle中的xml文件添加标记(转换xml)

向oracle中的xml文件添加标记(转换xml),xml,oracle,transform,xmltype,Xml,Oracle,Transform,Xmltype,我有一张填写了“XmlInfo”的表格。此字段是varchar2,包含XML。 不要问为什么它是varchar2-这是旧的数据库结构 我需要在这个xml中“添加”一个标记。 所以我使用了xmltype.createXML和APPENDCHILDXML的组合。问题在于输出 原始字段没有缩进。所以首先我使用带有“无缩进”选项的xmlserialize。不幸的是,这只在Oracle11中可用,我需要在Oracle10和Oracle11上执行此查询 所以我使用变换。但我还是被卡住了 原始值: <i

我有一张填写了“XmlInfo”的表格。此字段是varchar2,包含XML。 不要问为什么它是varchar2-这是旧的数据库结构

我需要在这个xml中“添加”一个标记。 所以我使用了xmltype.createXML和APPENDCHILDXML的组合。问题在于输出

原始字段没有缩进。所以首先我使用带有“无缩进”选项的xmlserialize。不幸的是,这只在Oracle11中可用,我需要在Oracle10和Oracle11上执行此查询

所以我使用变换。但我还是被卡住了

原始值:

<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:您的示例将空格作为标记值删除(例如
)。