我如何从 xml 获取 CDATA 值
How can i get CDATA value from xml
感谢点击,
我需要 CDATA 中的值
如果我想找一个叫 Maria 的人,她的生日是 2012-03-12
我如何找到它??
SELECT t.doc.extract('/RESPONSE/INFO/STU_NAME/text()').getStringVal()
"stu"
FROM table t
WHERE t.doc.extract('/RESPONSE/INFO/STU_NAME/text()').getStringVal()
LIKE '%M%'
我试过了,
但你看到下面是结果
我不需要
// XML
<STUDENT>
<INFO>
<STU_NAME><![CDATA[ Maria ]]></STU_NAME>
<STU_WARN><![CDATA[ one ]]></STU_WARN>
<BIRTHDAY><![CDATA[ 2012-03-12 ]]></BRITHDAY>
</INFO>
<INFO>
<STU_NAME><![CDATA[ Kevin) ]]></STU_NAME>
<STU_WARN><![CDATA[ one ]]></STU_WARN>
<BIRTHDAY><![CDATA[ 2010-07-15 ]]></BRITHDAY>
</INFO>
提取功能已被弃用很长时间(至少自 11gR2 以来 - 请参阅该文档中的说明)。
如果您有多个值并且可能希望查看多个值,您可以使用 XMLTable,它可以消除 CDATA 干扰(但可能需要 trim,因为值中有空格):
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
如果您的目标是单个值,您还可以使用 xmlquery,它更接近您的提取物:
select regexp_replace(
xmlquery('/RESPONSE/INFO[contains(BIRTHDAY, "2012-03-12")]/STU_NAME/text()'
passing doc
returning content),
'<!\[CDATA\[ *(.*?) *\]\]>', '') as stu_name
from your_table t
STU_NAME
--------
Maria
这是我在一个节点中寻找你想要的生日作为文本,并得到匹配的名字;但由于它仍然具有 CDATA,因此它与您所拥有的大致相同。因此,我使用了正则表达式来去除 CDATA 部分,但如果性能是一个问题,您也可以使用 substr/instr。
感谢点击,
我需要 CDATA 中的值
如果我想找一个叫 Maria 的人,她的生日是 2012-03-12 我如何找到它??
SELECT t.doc.extract('/RESPONSE/INFO/STU_NAME/text()').getStringVal()
"stu"
FROM table t
WHERE t.doc.extract('/RESPONSE/INFO/STU_NAME/text()').getStringVal()
LIKE '%M%'
我试过了, 但你看到下面是结果
我不需要
// XML
<STUDENT>
<INFO>
<STU_NAME><![CDATA[ Maria ]]></STU_NAME>
<STU_WARN><![CDATA[ one ]]></STU_WARN>
<BIRTHDAY><![CDATA[ 2012-03-12 ]]></BRITHDAY>
</INFO>
<INFO>
<STU_NAME><![CDATA[ Kevin) ]]></STU_NAME>
<STU_WARN><![CDATA[ one ]]></STU_WARN>
<BIRTHDAY><![CDATA[ 2010-07-15 ]]></BRITHDAY>
</INFO>
提取功能已被弃用很长时间(至少自 11gR2 以来 - 请参阅该文档中的说明)。
如果您有多个值并且可能希望查看多个值,您可以使用 XMLTable,它可以消除 CDATA 干扰(但可能需要 trim,因为值中有空格):
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
如果您的目标是单个值,您还可以使用 xmlquery,它更接近您的提取物:
select regexp_replace(
xmlquery('/RESPONSE/INFO[contains(BIRTHDAY, "2012-03-12")]/STU_NAME/text()'
passing doc
returning content),
'<!\[CDATA\[ *(.*?) *\]\]>', '') as stu_name
from your_table t
STU_NAME
--------
Maria
这是我在一个节点中寻找你想要的生日作为文本,并得到匹配的名字;但由于它仍然具有 CDATA,因此它与您所拥有的大致相同。因此,我使用了正则表达式来去除 CDATA 部分,但如果性能是一个问题,您也可以使用 substr/instr。