sql >> データベース >  >> RDS >> Oracle

OracleでHTMLテーブルを解析する

    あなたのpath tdを探しています trの下;しかし、2つあるため、「複数アイテムのシーケンスを取得しました」というエラーが表示されます。各tdを参照できます td[1]のように、位置でタグを付けます など。ただし、テーブル構造が期待どおりであることに大きく依存しています。

    この特定の例を使用すると、次のことができます。

    with tbl as
    (
        select xmltype('
            <table>
              <tbody>
                <tr class="blue"><td>code</td><td>rate</td></tr>
                <tr class="gray_1"><td><span>USD</span><em>1</em></td><td>476.16</td></tr>
                <tr class="gray_2"><td><span>AUD</span><em>1</em></td><td>327.65</td></tr>
                <tr class="gray_9"><td><span>IRR</span><em>100</em></td><td>1.13</td></tr>
                <tr class="blue"><td>some comment</td><td>some comment</td></tr>
                <tr class="gray_1"><td><span>EUR</span><em>1</em></td><td>526.54</td></tr>
              </tbody>
            </table>
        ') xml_data from dual
    )
    select
        x.class, x.currency, x.amount, to_number(x.rate) as rate
    from
        tbl
    cross join
        xmltable('/table/tbody/tr'
            passing tbl.xml_data
            columns
                class varchar2(10) path '@class',
                currency varchar2(3) path 'td[1]/span',
                amount number path 'td[1]/em',
                rate varchar2(50) path 'td[2]'
        ) x
    where
        x.currency is not null
    

    取得:

    CLASS      CUR     AMOUNT       RATE
    ---------- --- ---------- ----------
    gray_1     USD          1     476.16
    gray_2     AUD          1     327.65
    gray_9     IRR        100       1.13
    gray_1     EUR          1     526.54
    

    ただし、HTMLを壊すのにそれほど変化はありません。 この回答を参照 いくつかの理由でそれは壊れやすく、HTMLをXMLとして解析しようとするのが一般的に賢明でないと考えられている理由です。




    1. PostgreSQLの列値に従って指定された間隔

    2. 致命的なエラー:stdClass型のオブジェクトを配列として使用できません

    3. MySQLトリガーの作成中にエラーが発生しました

    4. トップ1のOracle結合条件