【问题标题】:Add tag to xml filed in oracle (transform xml)在 oracle 中的 xml 文件中添加标签(转换 xml)
【发布时间】:2013-09-11 11:59:39
【问题描述】:

我有一个提交“XmlInfo”的表格。此字段是 varchar2 并包含 XML。 不要问为什么是 varchar2 - 这是旧的数据库结构。

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

原始字段没有缩进。所以首先我使用带有“无缩进”选项的 xmlserialize。不幸的是,这仅在 oracle 11 中可用,我需要在 oracle 10 和 11 上都使用此查询。

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

原值:

<info><Managed>False</Managed></info>

预期:

<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>


我使用这个查询

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

Oracle 11 中的结果(如预期):

<info><Managed>False</Managed><ChangedDate>2013-09-11</ChangedDate></info>

Oracle 10 中的结果(有新行字符):

<info>
<Managed>False</Managed>
<ChangedDate>2013-09-11</ChangedDate>
</info>



这个转换有什么问题,或者有什么方法可以编写这个查询并在两个版本的 oracle 中按预期工作?

备注: 在下一步中,我将不得不更新这个值,所以我将使用“updatexml”。这就是为什么我不能只连接两个字符串。

【问题讨论】:

    标签: xml oracle transform xmltype


    【解决方案1】:

    什么问题让你缩进?无论如何,您只需将其放回 VARCHAR2 中,因此您可以使用与标签之间的 [:space:] 类匹配的简单 REGEX_REPLACE 去除缩进;类似:

    REGEXP_REPLACE(indentedxml, ">[[:space:]]+<", "><")
    

    【讨论】:

    • 对我来说 - 缩进无关紧要,但我们使用的第 3 个软件在括号之间的内容在哪里时会丢失:/ 第二:您的示例删除空格作为标签值(例如 &lt;tag&gt; &lt;/tag&gt;)。
    【解决方案2】:

    我通过完全删除 xml 引擎并使用纯文本来解决问题...
    通过结合 substrinstrcase 语句,我创建了丑陋、晦涩的 SQL,在特定位置注入正确的日期。
    取决于此节点中是否存在 ChangedDate 字符串和旧值。

    这是解决方法,因此我将问题标记为已回答。但如果有人知道缩进问题的真正答案,请告诉我。因为下一次更新可能不是那么容易只用字符串函数来处理......

    【讨论】:

      【解决方案3】:

      它不容易使用,但如果您需要生成 XML 的特定表示,XMLTransform 是正确的运算符。

      【讨论】:

        猜你喜欢
        • 2019-01-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        相关资源
        最近更新 更多