查询XML CLOB列以获取列中的子XML

jon*_*ite 1 xml sql oracle clob

我的表中有一个包含XML的CLOB列.我想在特定标签之后获取xml到其结束标签即

CLOB列中的完整XML

<ParentTag>
 <Location>ABC XYZ ....</Location>
 <Person>
  <Name>Mohsin</Name>
  <Age>23</Age>
 </Person>
</ParentTag>
Run Code Online (Sandbox Code Playgroud)

我想要获取的是这样的:

<Person>
  <Name>Mohsin</Name>
  <Age>23</Age>
</Person>
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用dbms_lob.substrdbms_lob.getlength,但这并没有帮助,因为子XML可能包含<Person>在不同场景中以不同字节开始的标记.

任何帮助将不胜感激.谢谢

Ale*_*ole 5

不要尝试用子串解析节点.Oracle内置了广泛的XML支持.您可以使用XMLQuery执行此操作:

select xmlquery('/ParentTag/Person' passing xmltype(xml_clob) returning content)
  as xml_value
from your_table;

XML_VALUE                                                                      
--------------------------------------------------------------------------------
<Person><Name>Mohsin</Name><Age>23</Age></Person>
Run Code Online (Sandbox Code Playgroud)

如果您的XML文档(在CLOB中)可以有多个人节点,那么您可以使用XMLTable来提取它们.

如果您希望它是与您显示的匹配的格式化字符串,而不是XML文档,则可以使用XMLSerialize包装器调用:

select xmlserialize(content
  xmlquery('/ParentTag/Person' passing xmltype(xml_clob) returning content)
    as varchar2(100) indent size=2) as string_value
from your_table;

STRING_VALUE                                                                   
--------------------------------------------------------------------------------
<Person>                                                                        
  <Name>Mohsin</Name>                                                           
  <Age>23</Age>                                                                 
</Person>
Run Code Online (Sandbox Code Playgroud)

跟进评论,如果您有anamespace,您可以将其声明为XPath的一部分:

select xmlquery('declare namespace NS4 = "http://soa.comptel.com/2011/02/instantlink"; /ParentTag/NS4:Person'
  passing xmltype(prov_request) returning content) as xml_value
from your_table;

select xmlserialize(content
  xmlquery('declare namespace NS4 = "http://soa.comptel.com/2011/02/instantlink"; /ParentTag/NS4:Person'
      passing xmltype(prov_request) returning content)
    as varchar2(150) indent size=2) as string_value
from your_table;
Run Code Online (Sandbox Code Playgroud)

提取的Person节点仍将具有该命名空间信息:

STRING_VALUE                                                                   
--------------------------------------------------------------------------------
<NS4:Person xmlns:NS4="http://soa.comptel.com/2011/02/instantlink">             
  <NS4:Name>Mohsin</NS4:Name>                                                   
  <NS4:Age>23</NS4:Age>                                                         
</NS4:Person>
Run Code Online (Sandbox Code Playgroud)