【问题标题】:How to use REGEXP_REPLACE如何使用 REGEXP_REPLACE
【发布时间】:2019-07-02 15:06:47
【问题描述】:

我有如下这样的字符串/xml 标记。请看下面的代码...

<filterCriteriaRow>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>EQUALTO</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>000000</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>BETWEEN</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>101001</value>
    <value>503099</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>EQUALTO</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>000000</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>BETWEEN</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>101001</value>
    <value>503099</value>
  </filterCriteriaItem>
  <conjunction>AND</conjunction>
</filterCriteriaRow>

我想操纵那个字符串变成这样:

<filterCriteriaRow>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>EQUALTO</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>000000</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>BETWEEN</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>101001</value>
    <value2>503099</value2>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>EQUALTO</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>000000</value>
  </filterCriteriaItem>
  <filterCriteriaItem>
    <attributeName>abcd</attributeName>
    <columnName>SEGMENT3</columnName>
    <operator>BETWEEN</operator>
    <conjunction>OR</conjunction>
    <valueDataType>STRING</valueDataType>
    <value>101001</value>
    <value2>503099</value2>
  </filterCriteriaItem>
  <conjunction>AND</conjunction>
</filterCriteriaRow>

如您所见,一个父标签中有一个双标签列“值” 我想创建第一个值标签成为“值”,但第二个值标签成为“value2”

如何使用 regexp_replace 操作该字符串?

请帮忙

【问题讨论】:

  • 你用什么编程语言编写代码?
  • Oracle PLSQL @AritroSen
  • 'value' 标签总是在 'filterCriteriaItem' 标签内?它也可以有多次出现(我的意思是超过2次)?
  • 是的,值标签始终在 filterCriteriaItem 标签中,并且值标签最多出现 2 个 @AritroSen
  • Obligatory link 关于尝试使用正则表达式而不是使用 DOM 解析器来解析 [X]HTML 是徒劳的。

标签: regex xml oracle plsql regexp-replace


【解决方案1】:

Oracle 中有许多 XML 选项,其中许多在最近的版本中已被弃用。

当前的一个选项是使用 xquery 更新,以下示例假设您的 XML 位于存储为 XMLTYPE 的表中。

假设每个 'filterCriteriaItem' 有两个 'value' 节点...

SELECT XMLQUERY (
          'copy $copy := . 
           modify (
             for $fci in $copy/filterCriteriaRow/filterCriteriaItem/value[2]
                return rename node $fci as "value2")
           return $copy'
          PASSING xml_doc 
          RETURNING CONTENT) new_xml_doc
FROM   table_name;

或者更一般地说...

SELECT XMLQUERY (
         'copy $copy := . 
          modify (
            for $fci in $copy/filterCriteriaRow/filterCriteriaItem
               for $val at $pos in $fci/value
                  return rename node $val as 
                     fn:concat("value", if ($pos = 1) then "" else $pos))
          return $copy'
         PASSING xml_doc 
         RETURNING CONTENT) new_xml_doc
FROM   table_name;

【讨论】:

    猜你喜欢
    • 2019-09-13
    • 2017-02-26
    • 2020-07-18
    • 2019-06-09
    • 2019-01-18
    • 2021-10-05
    • 2018-11-23
    • 1970-01-01
    • 2017-01-11
    相关资源
    最近更新 更多