2011-12-15
XML型のCONTEXTモードとDOCUMENTモード
XML型のロード検証をやっていてちょっと躓いたのでメモ。
XML型のカラムを作ってXML文書をINSERTしてみる。
xmldb=# INSERT INTO orders VALUES ('<A>a</A>');
INSERT 0 1
xmldb=# INSERT INTO orders VALUES ('<A>a</B>');
ERROR: invalid XML content
LINE 1: INSERT INTO orders VALUES ('<A>a</B>');
^
DETAIL: Entity: line 1: parser error : Opening and ending tag mismatch: A line 1 and B
<A>a</B>
^
Entity: line 1: parser error : chunk is not well balanced
<A>a</B>
^
xmldb=# INSERT INTO orders VALUES ('aaaa');
INSERT 0 1
xmldb=#
え?なんで単なる文字列がエラーにならないんだろう・・・。ちなみにこの状態でxpath関数を実行すると
xmldb=# select * from orders;ぐぬぬ・・・。xpath関数内のパースではエラーになってしまう。
data
----------
<A>a</A>
aaaa
(2 rows)
xmldb=# select xpath('/', data) FROM orders;
ERROR: could not parse XML document
DETAIL: Entity: line 1: parser error : Start tag expected, '<' not found
aaaa
^
xmldb=#
どうやらPostgreSQLのマニュアルを見るとXML型にはCONTENTとDOCUMENTの二種類の指定が可能で、デフォルトはCONTENTらしい。で、この場合にはXML型として、単一のテキストノードも許容するようだ。
でも、xpath関数の第2引数はDOCUMENTであることを前提にしているので、単一のテキストノードなんかを渡されるとエラーになると。
で、PostgreSQLの実行時設定の中に xmloption てのがあるっぽい。これにはCONTENTかDOCUMENTが指定可能。xmloptionにDOCUMENTを指定すると aaaa のようなリテラルはINSERT時にもエラーにしてくれるようだ。
xmldb=# SET xmloption TO DOCUMENT;
SET
xmldb=# INSERT INTO orders VALUES ('aaaa');
ERROR: invalid XML document
LINE 1: INSERT INTO orders VALUES ('aaaa');
^
DETAIL: Entity: line 1: parser error : Start tag expected, '<' not found
aaaa
^
xmldb=#
CONTENT指定があるのは構わないけど、なんでデフォルトはDOCUMENTじゃないんだろう(´・ω・`)
トラックバック - http://d.hatena.ne.jp/nuko_yokohama/20111215/1323921100
リンク元
- 463 http://pipes.yahoo.com/pipes/pipe.info?_id=c021b165b3a7976a4259958b8a56b5af
- 2 http://d.hatena.ne.jp/keyword/リテラル
- 2 http://www.rememberthemilk.com/home/uemuraj/
- 1 http://bit.ly/siVHTL
- 1 http://bit.ly/vpqxxy
- 1 http://blog.livedoor.jp/harada_toshi/
- 1 http://blog.livedoor.jp/harada_toshi/archives/51840456.html
- 1 http://blog.livedoor.jp/harada_toshi/archives/cat_50015211.html
- 1 http://d.hatena.ne.jp/keyword/XPath
- 1 http://d.hatena.ne.jp/search?word=&name=nuko_yokohama&diary=日記
