微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我如何从 xml

如何解决我如何从 xml

感谢点击,

  1. 我需要 CDATA 中的值

  2. 如果我想找一个叫玛丽亚,生日是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 噪音(但可能需要修剪,因为您的值中有空格):

const exerciseRunning = useRef(true);
const directionForward = useRef(true);

const [progress,setProgress] = useState(0);

const [coord1,setCoord1] = useState({x: 0,y: 0});
const [coord2,setCoord2] = useState({x: 0,y: 0});

const [percentage,setPercentage] = useState(1);

useAnimationFrame((deltaTime) => {
    // Works!
    if (!exerciseRunning.current) {
      return;
    }

    // setProgress works!
    // directon.Forward works!
    // percentage does not work!
    setProgress((prevState) =>
      directionForward.current
        ? prevState + percentage * 1
        : prevState - percentage * 2
    );
  },[percentage]  
);
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%'

如果您的目标是单个值,您还可以使用 xmlquery,它更接近您的提取:

STU_NAME BIRTHDAY  STU_NAME2 BIRTHDAY2
-------- --------- --------- ---------
 Maria   12-MAR-12 Maria     2012-03-12
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

这是我在节点中查找您想要的生日作为文本,并获得匹配的名称;但由于它仍然具有 CDATA,它与您拥有的大致相同。所以,我使用了一个正则表达式来去除 CDATA 部分,不过如果你关心性能,你也可以使用 substr/instr。

db<>fiddle

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。