5

次の形式の XML ドキュメントがあります...

<?xml version="1.0" encoding="UTF-8"?>
<yahootable>
    <row>
        <various><![CDATA[ multiline 
        text, "&" 
        other <stuff> ]]>
        </various>
        <id>1</id>
        <message><![CDATA[
                sdfgsdfg
                dsfsdfsd ]]>
        </message>
    </row>
<yahootable>

...MySQL の LOAD XML LOCAL INFILE を使用して、列を持つテーブルに挿入したい。(さまざまな、id、メッセージ)。解析されていない CDATA タグからデータベースの列にデータを取得できないようです。CDATA タグ間のデータが完全に無視されているということですか、それとも何か見落としがあるのでしょうか? 私は、CDATA が不正な XML 文字をエスケープし、通常のテキストとして挿入するだけだと思っていました。

ありがとう。

4

1 に答える 1

7

LOAD XML INFILECDATA の内容を保持しながらこれを行う方法が見つかりませんでした。ただし、次のように動作し、古き良きものLOAD DATA INFILEを with とともに使用ExtractValue()して同じことを達成します。

サンプル ファイルとこのテーブルがある場合:

CREATE TABLE `yahootable` (
  `id` int(11) NOT NULL PRIMARY KEY,
  `various` text,
  `message` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8
;

次に、このステートメントを実行すると、ファイルの内容がテーブルにインポートされます。

LOAD DATA INFILE 
    '/tmp/yahootable.xml'
INTO TABLE 
    yahootable
CHARACTER SET 'utf8'
LINES STARTING BY '<row>' TERMINATED BY '</row>'
(@tmp)
SET
  id      = ExtractValue(@tmp, '//id'),
  various = ExtractValue(@tmp, '//various'),
  message = ExtractValue(@tmp, '//message')
;

これは、LOAD DATA INFILE に、それぞれ<row>...</row>が論理的な「行」であり、ローカル変数に格納されることを伝えることによって機能します@tmp。次に、これをXML フラグメントとしてExtractValue関数に渡し、適切な XPath 式を使用して必要な値を選択します。

于 2013-10-10T01:07:25.120 に答える