Re: xpath improvement suggestion

From: Arie Bikker <arie(at)abikker(dot)nl>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Re: xpath improvement suggestion
Date: 2010-01-06 22:46:27
Message-ID: 4B4512C3.8080002@abikker.nl
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

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(at)abikker(dot)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']]);

kind regards, Arie Bikker

Attachment Content-Type Size
xpathobj.patch text/x-patch 3.6 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Alvaro Herrera 2010-01-06 23:04:32 Re: Testing with concurrent sessions
Previous Message Kevin Grittner 2010-01-06 22:24:06 Re: Testing with concurrent sessions