Short summary:
I want something like xpath_list() that returns an array (instead of a delimited, concatenated string) when multiple nodes exist in an XML file. It feels to me like that'd be a better (cleaner) API.
Before I write one, does anyone already have such a patch? If not, would people be interested if I added xpath_array() that behaves like xpath_list() but returns an array instead of one big string?
Or... is xpsql on gborg or some other postgresql-xml project a better place for me to be looking?
Longer:
From the (very cool) xml2 package's README, I see xpath_list(document,query,separator) RETURNS text This function returns multiple values separated by the specified separator, e.g. Value 1,Value 2,Value 3 if separator=','.
xpath_list(document,query) RETURNS text This is a wrapper for the above function that uses ',' as the separator.
And indeed, that's exactly what it returns:
fl=# create temporary table x (xml text);
flee=# insert into x values ('<a><b id="1">1</b><b id="2">2</b></a>'); flee=# select xpath_list(xml,'/a/b') from x; xpath_list ------------ 1,2 (1 row)
However to make use of each value, I'd then need to re-parse that text string to make use of each of the values.
I realize I can get the effect I want using an uncommon string as a delimiter and the string_to_array() function... fl=# select string_to_array(xpath_list(xml,'/a/b','##delim##') ,'##delim##') from x; string_to_array ----------------- {1,2} (1 row) ... but that feels pretty ugly considering to guess what delimiter won't be in the string.
While I'm at it, a version of xpath_nodeset: fl=# select xpath_nodeset(xml,'/a/b') from x; xpath_nodeset -------------------------------- <b id="1">1</b><b id="2">2</b> (1 row) that returned an array of matching XML fragments instead of all the fragments concatenated together might also be useful.
Thoughts? Suggestions?
Ron
---------------------------(end of broadcast)--------------------------- TIP 9: the planner will ignore your desire to choose an index scan if your joining column's datatypes do not match