У меня есть тег string/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>
Как вы можете видеть, в одном родительском теге есть столбец с двойным тегом «значение». Я хочу, чтобы первый тег значения стал «значением», а второй тег значения стал «значение2».
Как манипулировать этой строкой с помощью regexp_replace?
Пожалуйста помоги
Oracle PLSQL @AritroSen
Тег value всегда будет внутри тега filter Criteria Item? Также может ли он иметь несколько вхождений (я имею в виду более 2)?
Да, тег значения всегда в теге filterCriteriaItem и несколько вхождений тега значения максимум 2 только @AritroSen
Не знаю о PLSQL, но это можно сделать с помощью библиотек на родном языке (Java/C#/Python). По сути, вам нужно перебрать каждый «filterCriteriaItem» и найти второе вхождение тега «value» и соответствующим образом отредактировать его.
Да, я думал об этом, используя iterate. Может быть, есть простые способы добиться этого. Большое спасибо @AritroSen





В Oracle есть ряд опций XML, многие из которых устарели в последних версиях.
Одним из текущих вариантов будет использование xquery update, в следующих примерах предполагается, что ваш XML находится в таблице, хранящейся как XMLTYPE.
Предполагая, что два узла «значение» на «filterCriteriaItem»...
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;
На каком языке программирования вы кодируете?