Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como posso obter o valor CDATA de xml


A função de extração está obsoleta há muito tempo (pelo menos desde 11gR2 - ver a nota nessa documentação).

Se você tiver vários valores e quiser ver mais de um, poderá usar XMLTable, que remove o ruído CDATA (mas pode precisar de um corte, pois há espaços nos valores):
select x.stu_name, x.birthday,
  trim(stu_name) as stu_name2, to_char(x.birthday,'YYYY-MM-DD') as birthday2
from your_table t
cross join xmltable ('/RESPONSE/INFO' passing t.doc
  columns
    stu_name varchar2(30) path 'STU_NAME',
    birthday date path 'BIRTHDAY'
) x
where x.stu_name like '%M%'
STU_NAME BIRTHDAY  STU_NAME2 BIRTHDAY2
-------- --------- --------- ---------
 Maria   12-MAR-12 Maria     2012-03-12

Se você estiver segmentando um único valor, também poderá usar xmlquery, que está mais próximo da sua extração:
select regexp_replace(
  xmlquery('/RESPONSE/INFO[contains(BIRTHDAY, "2012-03-12")]/STU_NAME/text()'
    passing doc
    returning content),
  '<!\[CDATA\[ *(.*?) *\]\]>', '\1') as stu_name
from your_table t
STU_NAME
--------
Maria

Aqui está eu procurei o aniversário que você queria como texto dentro de um nó e obtive o nome correspondente; mas como isso ainda tem o CDATA é mais ou menos o mesmo que você tinha. Portanto, usei uma expressão regular para remover a parte CDATA, embora você também possa usar substr/instr se o desempenho for uma preocupação.

db<>fiddle