Oracle SUBSTR XML 解析

Posted

技术标签:

【中文标题】Oracle SUBSTR XML 解析【英文标题】:Oracle SUBSTR XML Parse 【发布时间】:2015-09-20 08:02:38 【问题描述】:

我在表中有某些具有不同 XML 结构的值。

有一个标签<problemDesc> 'error' </problemDesc> 它存在于所有 XML 块中。

如何使用 SubStr 和 InStr 函数从标签中提取错误?或者有没有办法获得价值。

【问题讨论】:

【参考方案1】:

使用字符串函数解析 XML 不是一个好主意。改用内置的 XML 解析功能:

SqlFiddleDemo

select *  
FROM 
     XMLTABLE('//problemDesc'  
         PASSING   
            xmltype('<problemDesc>error</problemDesc>')
         COLUMNS  
            error  varchar2 (200) PATH '.'  
     ) xmlt  
;

【讨论】:

【参考方案2】:

虽然我同意这是一个坏主意,但以您提出的类似问题的方式回答问题是可行的:

SELECT SUBSTR('<problemDesc>Error 1</problemDesc>', 
  INSTR('<problemDesc>Error 1</problemDesc>', '<problemDesc>') + LENGTH('<problemDesc>'), 
  INSTR('<problemDesc>Error 1</problemDesc>', '</problemDesc>') - (INSTR('<problemDesc>Error 1</problemDesc>', '<problemDesc>') + LENGTH('<problemDesc>')))
FROM DUAL;

换句话说

SELECT SUBSTR(COL_NAME, 
  INSTR(COL_NAME, '<problemDesc>') + LENGTH('<problemDesc>'), 
  INSTR(COL_NAME, '</problemDesc>') - (INSTR(COL_NAME, '<problemDesc>') + LENGTH('<problemDesc>')))
FROM SOME_TABLE;

这只有在这些标签不出现多次时才有效。但是,理论上您正在寻找 START 标签的开头,并且想要转到 END 标签的开头。

【讨论】:

【参考方案3】:

为什么要进行字符串操作?? 试试这个:

SQL> select extractvalue(xmltype('<a>abhi</a>'),'//a/text()') from dual;

EXTRACTVALUE(XMLTYPE('<A>ABHI<
--------------------------------------------------------------------------------
abhi

【讨论】:

以上是关于Oracle SUBSTR XML 解析的主要内容,如果未能解决你的问题,请参考以下文章

Oracle REGEXP_SUBSTR 解析美元金额

Oracle函数的使用

oracle, xmltype/clob substr 循环

php怎么截取字符后面几个字符?

Oracle使用REGEXP_SUBSTR返回括号内的值

oracle PL/SQL解析xml