3

请假设您有一个 XML 文件(例如,存储在一个也有 CLOB 列的 Oracle 表中):

<ALFA>
  <BETA>0123</BETA>
  <GAMMA>2345</GAMMA>
  <DELTA>
     <EPSILON>3</EPSILON>
  </DELTA>
</ALFA>

如何在输出中生成所有可能路径的列表?

/ALFA/BETA/text()
/ALFA/GAMMA/text()
/ALFA/DELTA/EPSILON/text()

我的需要如下:我必须从长 XML 中提取许多信息,并且必须将 XMLEXTRACT 与所有可能的路径一起使用,所以我想知道是否可以以自动方式“dbms_output.put_line”它们。

我需要一个独立于标签名称的解决方案。

请假设 XML 格式正确。

预先感谢您的帮助。


  • 在第二种情况下:

如果尚未安装 Oracle Java 扩展,我该如何继续,并且收到以下错误?

ORA-19112: error raised during evaluation:  
ORA-06550: line 1, column 13:
PLS-00201: identifier 'SYS.DBMS_XQUERYINT' must be declared
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored

请假设我不是 DBA,并且 DBA 不授权 Oracle Java Extension 安装。

4

1 回答 1

5

您可以使用XMLTableXQuery 生成路径列表。

例如

( SQLFiddle )

with params as (
  select 
    xmltype('
      <ALFA>
        <BETA>0123</BETA>
        <GAMMA>2345</GAMMA>
        <DELTA>
           <EPSILON>3</EPSILON>
        </DELTA>
      </ALFA>
    ') p_xml
  from dual  
)    
select
  path_name || '/text()'
from
  XMLTable(
    '
      for $i in $doc/descendant-or-self::*
        return <element_path> {$i/string-join(ancestor-or-self::*/name(.), ''/'')} </element_path>
    '
    passing (select p_xml from params) as "doc"
    columns path_name varchar2(4000) path '//element_path'
  )

但至少这是一种错误的方式,因为它没有尽可能有效。

只需使用相同的 XQuery 提取所有值:(SQLFiddle

with params as (
  select 
    xmltype('
      <ALFA>
        <BETA>0123</BETA>
        <GAMMA>2345</GAMMA>
        <DELTA>
           <EPSILON>3</EPSILON>
        </DELTA>
      </ALFA>
    ') p_xml
  from dual  
)    
select
  element_path, element_text
from
  XMLTable(
    '              
      for $i in $doc/descendant-or-self::*
        return <element>
                 <element_path> {$i/string-join(ancestor-or-self::*/name(.), ''/'')} </element_path>
                 <element_content> {$i/text()}</element_content>
               </element>  
    '
    passing (select p_xml from params) as "doc"
    columns 
      element_path   varchar2(4000) path '//element_path',
      element_text   varchar2(4000) path '//element_content'
  )
于 2013-08-09T14:30:57.133 回答