【问题标题】:Extracting XML sub-tags from a clob in Oracle via SQL通过 SQL 从 Oracle 中的 clob 中提取 XML 子标签
【发布时间】:2017-09-07 20:19:10
【问题描述】:

我在 DB 属性“object_body”中有以下 CLOB XML 片段:

<object stamp="8fc630bd-f1f5-43ac-b9d2-3b9db9054c75_1481811010527" type="Aggregation" version="12">
  <property name="name" value="COA_Cash_Position" valueType="string"/>
  <property name="description" value="COA_Cash_Position" valueType="string"/>
  <property name="objectId" value="ef4296f1-6af6-4de8-83fe-fa01cf327d87" valueType="string"/>
  <property name="branchId" value="01ecc9ed-27f3-42cb-a44d-2cec221ec8fa" valueType="string"/>
  <property name="models" valueType="table">
    <object type="ModelBasedTask:modelEntry" version="3">
      <property name="dataModel" valueType="url">DataModel["ModifyModel[COA_Cash_Positions_BHS_Unadjusted].STAGING:X_NRS_BSL40K_BHS"{ModifyModel[ff81e5f2-2ef6-437a-b113-67f7c0dd5e53].cdf308fc-520d-4611-a8db-4e6863e216b8:9ffcd08e-732a-4270-b15f-f4775bcc69db}]</property>
      <property name="instanceSelectionRule" valueType="object">
        <object type="InstanceSelectionRule" version="3">
          <property name="instanceDateRule" valueType="object">
            <object type="InstanceSelectionRule:rule" version="3">
              <property name="type" value="EQUAL" valueType="string"/>
            </object>
          </property>
          <property name="instanceKeyRules" valueType="table"/>
        </object>
      </property>
    </object>
  </property>
</object>

目的是提取name=”description”的属性标签的值
=> 生成“COA_Cash_Position”

尝试了以下所有变体:

EXTRACTVALUE(xmltype(object.object_body), '/object/property[@name="description"].getStringVal()'),

如果我松开 .getStringVal() 查询有效,但显然只提供空结果(因为属性标签本身不包含任何值)。

主要获取以下错误消息:

ORA-31011: XML 解析失败 ORA-19202: XML 处理中发生错误 LPX-00601:无效令牌:'/object/property[@name="description"]。 getStringVal()'

简单的方法是提取两个 xml 标记之间的值,但获取一个特定的属性值(如这里 name="description" 的标记的“值”)似乎避开了 XML 提取的可能性。

非常感谢任何帮助...

【问题讨论】:

  • 你的xml不好。它包含错误。
  • ORA-19202 错误是因为您试图在 Xpath 中使用 getStringVal()。它不是 Xpath 函数,而是 XMLType 对象上的 Oracle 函数。
  • @MT0 确定您放置了正确的封闭标签?我可以通过几种方式修复它,这是只有作者知道的。
  • @Seyran 修复的语义含义与问题答案的正确性无关 - 示例可以被剥离到最低限度并且所有嵌套对象都被剥离,但它仍然不会影响答案。

标签: sql xml oracle xpath


【解决方案1】:

假设你的意思是@value属性的值你想要的路径是

/object/property[@name='description']/@value

【讨论】:

    【解决方案2】:

    EXTRACTVALUE 在 Oracle 12 中已弃用 - 它正在被 XMLTABLEXMLQUERY 取代。

    SELECT x.description
    FROM   your_table t
           CROSS JOIN
           XMLTABLE(
             '//object/'
             PASSING XMLTYPE( t.your_clob_column )
             COLUMNS description VARCHAR2(4000) PATH './property[@name="description"]/@value'
           ) x;
    

    SELECT XMLQUERY(
             '//object/property[@name="description"]/@value'
             PASSING XMLTYPE( your_clob_column )
             RETURNING CONTENT
           ).getStringVal()
    FROM   your_table;
    

    但如果你确实想使用EXTRACTVALUE,你可以这样做:

    SELECT EXTRACTVALUE(
             XMLTYPE( your_clob_column ),
             '//object/property[@name="description"]/@value'
           )
    FROM   your_table;
    

    【讨论】:

    • 感谢 MTO,这正是我想要的。其他人也提供了很大的帮助,但我同意 XPATH 替代方案是最可靠的,特别是如果我有许多大型且自动生成(因此很混乱)的 XML 对象。非常感谢……
    • 差不多了 - ;=) 如果 XML 的构造与我正在处理的一样混乱,则会出现新问题:
      是否有 XPATH 方法仅选择第一个属性name="description" 但不是后续的(在同一个单记录 XML 对象中)?
    • @TomDebus '//object/property[@name="description"][1]/@value'
    • 完美,非常感谢,这实际上解决了我的问题。将不得不深入研究 XPath 作为下一个学习目标。再次感谢您的帮助。
    【解决方案3】:

    您的 XML 包含一些错误。 我们可以在 oracle 中使用 REGEXP 实现您的预​​期输出。 检查以下查询。

     SELECT REGEXP_REPLACE(REGEXP_REPLACE(REGEXP_SUBSTR (object_body, 'description" value=".*.".v', 1), 'description" value="', '', 1, 1) ,'" v','',1,1)   
     FROM Table
    

    在此处查看Demo

    输出为:COA_Cash_Position

    【讨论】:

    • 如果交换了valuename 属性会发生什么? XML 仍然具有与该标记完全相同的属性和含义,但您的查询会中断。或者,如果在namevalue 属性之间的标记中添加了另一个属性。或者,如果在 &lt;property name="otherdescription" value="don't want this" /&gt; 之前添加了另一个标签。
    • 然后根据要求更改查询@MT0。
    • 重点不是需求变了,而是需求不变,数据的顺序变了,但数据的语义没有变。使用 XPATH,对于我在之前的评论中提出的 3 种情况中的任何一种,XML 都会得到正确的答案,但您的正则表达式不会。除少数情况外,正则表达式是wrong solution for parsing XML(请参阅前 3 个答案)。
    • 尊敬的 Bhosale 先生,感谢您的回答。不幸的是,虽然您的解决方案完美无缺,但 XML 是如此混乱,以至于它多次包含相同的属性名称(描述)。而且我只对每个记录/clob 对象中的第一次出现感兴趣。
    • @TomDebus 欢迎。我已经给出了另一个解决方案而不是 XML。如果它的工作那么标记 plz 或投票
    猜你喜欢
    • 2023-03-09
    • 2015-11-21
    • 2012-11-26
    • 2015-12-21
    • 2012-11-16
    • 2016-07-19
    • 2012-04-25
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多