Re: xpath improvement suggestion - Mailing list pgsql-hackers
From | Scott Bailey |
---|---|
Subject | Re: xpath improvement suggestion |
Date | |
Msg-id | 4B452BA9.1030307@comcast.net Whole thread Raw |
In response to | Re: xpath improvement suggestion (Arie Bikker <arie@abikker.nl>) |
List | pgsql-hackers |
Arie Bikker wrote: > Sorry for the previous NUUUB post, didn't now the mailing list doesn't > support html ;( > Robert Haas wrote: >> On Tue, Jan 5, 2010 at 6:09 PM, Arie Bikker <arie@abikker.nl> wrote: >> >>> Hi all, >>> >>> Well I had to burn some midnight oil trying to figure out why a >>> construct >>> like >>> SELECT xpath('name()','<a/>'); >>> doesn't give the expected result. Kept getting an empty array: >>> xpath >>> ------------- >>> {} >>> instead of the expected "{a}" >>> BugID 4294 and the TODO item "better handling of XPath data types" >>> pointed >>> in the right direction. >>> whithin src/backend/utils/adt/xml.c in the function xpath the result >>> of the >>> call to xmlXPathCompiledEval is not handled optimally. In fact, the >>> result >>> is assumed to be a nodeset without consulting the ->type member of the >>> result. I've made some minor changes to xml.c to handle some non-nodeset >>> results of xmlXPathCompiledEval. >>> Essentially, the revised code makes an array of all the nodes in the >>> xpathobj result in case this is a nodeset, or an array with a single >>> element >>> in case the reult is a number/string/boolean. The problem cases >>> mentioned in >>> http://archives.postgresql.org/pgsql-hackers/2008-06/msg00616.php now >>> work >>> as expected. >>> Revision of the code involves: >>> - A switch statement to handle the result type of xmlXPathCompiledEval. >>> - an additional function xmlpathobjtoxmltype. >>> >>> diff of the revisioned code with respect to original is in attached >>> file. >>> >>> kind regards, Arie Bikker >>> >> >> Hi, >> >> Could you please resend this as a context diff and add it to our patch >> management application? >> >> http://wiki.postgresql.org/wiki/Submitting_a_Patch >> https://commitfest.postgresql.org/action/commitfest_view/open >> >> Thanks! >> >> ...Robert >> > Hope this is the right attachement type (I'm new at this) > BTW. here a some nice examples: > > - Get the number of attributes of the first childnode: > > select ( xpath('count(@*)',(xpath('*[1]','<a b="c"><d e="f" > g="j"/></a>'))[1]))[1]; > > - an alternative for xpath_exist('/a/d') > select (xpath('boolean(/a/d)','<a b="c"><d e="f" g="j"/></a>'))[1]; > > - fixes bug 4206 > > select xpath('//text()',xmlparse(document '<?xml > version="1.0"?><elem1><elem2>one</elem2><elem2>two</elem2><elem2>three</elem2><elem3att="2"/></elem1>')); > > > - fixes bug 4294 > > select xpath('name(/my:a/*[last()])', '<a > xmlns="http://myns.com/ns"><b>text1</b><c>text2</c></a>', > ARRAY[ARRAY['my','http://myns.com/ns']]); Awesome! This really helps. Scott
pgsql-hackers by date: