2

PostgreSQL 9.1 では、次の 2 つのクエリをエラーなしで実行でき、正しい結果が得られます。

SELECT xpath('/a', '<a s:dd="11"><c>test</c></a>')
SELECT xpath('/a', '<a s:dd="11"><c>test</c></a>',ARRAY[ARRAY['s', 'http://example.com']])

PostgreSQL 9.2 では、同じクエリで次のエラーがスローされます。

ERROR:  could not parse XML document
DETAIL:  line 1: Namespace prefix s for dd on a is not defined

このクエリのみが正常に機能します。

SELECT xpath('/a', '<a xmlns:s="ddd" s:dd="11"><c>test</c></a>')

XMLコードを変更せずに、XMLファイルを解析するにはどうすればよいですか?

前のクエリから受け取った xml 要素の xpath クエリを作成したいときに問題が発生します。

xml ドキュメントの例:

 <some xmlns:my="somens">
      <a>
          <b my:param="11" />
      </a>
 </some>

そして、私はこのようなことをしたい:

 elem = xpath('/a',doc);
 elem2= xpath('//b',elem[0]);

未知の接頭辞 my のため、2 行目でエラーが発生します。何か案は?

4

1 に答える 1

1

PostgreSQL の破壊的な機能以外にあなたが抱えている問題は見当たりません。最初の文書では

これは、厳密な XML パーサーから予期される動作です。PostgreSQL が動作を変更したという事実は悪いことですが、対処しなければならないことだと思います。

これ

SELECT xpath('/a', '<a s:dd="11"><c>test</c></a>')

s名前空間が XML ドキュメントで宣言されていないため、失敗します。これは機能します:

# SELECT xpath('/a', '<a xmlns:s="http://example.com" s:dd="11"><c>..</c></a>');
                      xpath                       
--------------------------------------------------
 {"<a xmlns:s=\"http://example.com\" s:dd=\"11\">+
   <c>..</c>                                   +
 </a>"}
(1 row)

ここで行っていること:

SELECT xpath('/a', '<a xmlns:s="http://example.com" s:dd="11"><c>..</c></a>',
    ARRAY[ARRAY['s', 'http://example.com']]);

s名前空間をバインドして、http://example.comその名前空間で xpath 式を実行できるようにすることです。観察:

これは元のクエリですが、aタグはhttp://example.com名前空間にあります。デフォルトの名前空間の要素を照会しているため、クエリ ( /a) はどのドキュメントとも一致しません:a

# SELECT xpath('/a', '<s:a xmlns:s="http://example.com" s:dd="11"><c>test</c></s:a>');
 xpath 
-------
 {}
(1 row)

ただし、これはルート要素を選択します。

# SELECT xpath('/x:a', '<s:a xmlns:s="http://example.com" s:dd="11"><c>..</c></s:a>',
    ARRAY[ARRAY['x', 'http://example.com']]);
                       xpath                        
----------------------------------------------------
 {"<s:a xmlns:s=\"http://example.com\" s:dd=\"11\">+
   <c>test</c>                                     +
 </s:a>"}
(1 row)

sxが同じ名前空間にバインドされていることに注目してくださいhttp://example.com。異なる名前空間バインディングを使用するのはややこしいですが、それがどのように機能するかをお見せしたかっただけです。

于 2012-12-31T10:11:33.040 に答える