mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-08-17 13:23:23 +02:00
|
||
---|---|---|
.. | ||
Makefile | ||
pgxml.c | ||
pgxml.h | ||
pgxml.source | ||
README | ||
TODO | ||
xpath-yacc |
This package contains a couple of simple routines for hooking the expat XML parser up to PostgreSQL. This is a work-in-progress and all very basic at the moment (see the file TODO for some outline of what remains to be done). At present, two functions are defined, one which checks well-formedness, and the other which performs very simple XPath-type queries. Prerequisite: expat parser 1.95.0 or newer (http://expat.sourceforge.net) I used a shared library version -I'm sure you could use a static library if you wished though. I had no problems compiling from source. Function documentation and usage: --------------------------------- pgxml_parse(text) returns bool parses the provided text and returns true or false if it is well-formed or not. It returns NULL if the parser couldn't be created for any reason. pgxml_xpath(text doc, text xpath, int n) returns text parses doc and returns the cdata of the nth occurence of the "XPath" listed. See below for details on the syntax. Example: Given a table docstore: Attribute | Type | Modifier -----------+---------+---------- docid | integer | document | text | containing documents such as (these are archaeological site descriptions, in case anyone is wondering): <?XML version="1.0"?> <site provider="Foundations" sitecode="ak97" version="1"> <name>Church Farm, Ashton Keynes</name> <invtype>watching brief</invtype> <location scheme="osgb">SU04209424</location> </site> one can type: select docid, pgxml_xpath(document,'/site/name',1) as sitename, pgxml_xpath(document,'/site/location',1) as location from docstore; and get as output: docid | sitename | location -------+-----------------------------+------------ 1 | Church Farm, Ashton Keynes | SU04209424 2 | Glebe Farm, Long Itchington | SP41506500 (2 rows) "XPath" syntax supported ------------------------ At present it only supports paths of the form: 'tag1/tag2' or '/tag1/tag2' The first case will find any <tag2> within a <tag1>, the second will find any <tag2> within a <tag1> at the top level of the document. The real XPath is much more complex (see TODO file). John Gray <jgray@azuli.co.uk> 26 July 2001