【问题标题】:How to parse XML file in Oracle SQL如何在 Oracle SQL 中解析 XML 文件
【发布时间】:2013-01-07 14:12:17
【问题描述】:

我从以下网站下载了每日交换文件到数据库中。如何使用 oracle SQL 解析以下 XML 文档?

“http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote;currency=true?view=basic&format=json”

【问题讨论】:

  • format=json 判断,我确实相信这是一个 json,而不是 xml。如果您需要,您可以通过更改它以 XML 格式获得它:http://finance.yahoo.com/webservice/v1/symbols/allcurrencies/quote;currency=true?view=basic&format=xml

标签: sql xml json oracle


【解决方案1】:

如果您想解析 JSON 文件,PL/JSON 库可以帮助您。 Pl/JSON site

【讨论】:

    【解决方案2】:

    如果您真的下载了 XML 版本而不是 JSON 版本,您可以形成如下基本查询:

    select /*+ cursor_sharing_exact */ id, classname, name, value
      from (select rownum id, classname, field_list
              from myxml mx cross join
                   xmltable('/list/resources/resource'
                            passing xmltype(mx.mydoc)
                            columns classname  varchar2(100) path '@classname',
                            field_list xmltype path 'field'
    
                           )
           ) 
           cross join xmltable('/field'
                        passing field_list
                        columns
                        name varchar2(200) path '@name',
                        value varchar2(200) path '.'
                       )
    

    这会给你这样的输出:

    SQL> select /*+ cursor_sharing_exact */ id, classname, name, value
      2    from (select rownum id, classname, field_list
      3            from myxml mx cross join
      4                 xmltable('/list/resources/resource'
      5                          passing xmltype(mx.mydoc)
      6                          columns classname  varchar2(100) path '@classname',
      7                          field_list xmltype path 'field'
      8                         )
      9         )
     10         cross join xmltable('/field'
     11                      passing field_list
     12                      columns
     13                      name varchar2(200) path '@name',
     14                      value varchar2(200) path '.'
     15                     )
     16  /
    
            ID CLASSNAME            NAME                 VALUE
    ---------- -------------------- -------------------- --------------------
             1 Quote                change               0.099976
             1 Quote                chg_percent          0.009367
             1 Quote                name                 USD/KRW
             1 Quote                price                1067.400024
             1 Quote                symbol               KRW=X
             1 Quote                ts                   1359020860
             1 Quote                type                 currency
             1 Quote                volume               0
    

    你当然可以 PIVOT 那个。

    with data as (select /*+ cursor_sharing_exact */ id, classname, name, value
                    from (select rownum id, classname, field_list
                            from myxml mx cross join
                                 xmltable('/list/resources/resource'
                                          passing xmltype(mx.mydoc)
                                          columns classname  varchar2(100) path '@classname',
                                          field_list xmltype path 'field'
                                         )
                         ) 
                         cross join xmltable('/field'
                                      passing field_list
                                      columns
                                      name varchar2(200) path '@name',
                                      value varchar2(200) path '.'
                                     ) ) select id, classname,
           max(case when name = 'change' then value end) change,
           max(case when name = 'chg_percent' then value end) chg_percent,
           max(case when name = 'name' then value end) name,
           max(case when name = 'price' then value end) price,
           max(case when name = 'symbol' then value end) symbol,
           max(case when name = 'ts' then value end) ts,
           max(case when name = 'type' then value end) type,
           max(case when name = 'volume' then value end) volume   
     from data  
    group by id, classname 
    order by id
    

    一个样本(缩短的数据):http://sqlfiddle.com/#!4/7b53c/1

    【讨论】:

      猜你喜欢
      • 2019-02-02
      • 1970-01-01
      • 2012-08-15
      • 1970-01-01
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多