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:

Previous
From: Andrew Dunstan
Date:
Subject: Re: Testing plperl<->plperlu interaction
Next
From: Robert Haas
Date:
Subject: Re: unresolved bugs