Thread: help with xpath namespace

help with xpath namespace

From
Brian Sherwood
Date:
I am trying to use xpath to extract some information from a XML document.
(if it matters, It's the router config for a Juniper router)

I believe I am having problems with the namespace.
I am trying to extract the serial-number, but I am not getting anything.

Here is the script I have been testing with:


BEGIN;

CREATE TABLE "xml_test" (       data_xml        xml
);


INSERT INTO xml_test (data_xml) VALUES ('<chassis-inventory xmlns="http://xml.juniper.net/junos/9.6R4/junos-chassis">
<chassisjunos:style="inventory">    <name>Chassis</name>    <serial-number>JN1111111111</serial-number>
<description>MX960</description> </chassis></chassis-inventory>');
 


select data_xml from xml_test where data_xml is document;

select (xpath('/chassis-inventory/chassis/serial-number/text()',       data_xml,       ARRAY[ARRAY['junos',
'http://xml.juniper.net/junos/9.6R4/junos-chassis']]      )) from xml_test;

ROLLBACK;


This gives me the following:


BEGIN
CREATE TABLE
INSERT 0 1                                  data_xml
------------------------------------------------------------------------------- <chassis-inventory
xmlns="http://xml.juniper.net/junos/9.6R4/junos-chassis">+  <chassis junos:style="inventory">
             +     <name>Chassis</name>                                                    +
<serial-number>JN1111111111</serial-number>                            +     <description>MX960</description>
                            +   </chassis>                                                                +
</chassis-inventory>
(1 row)
xpath
-------{}
(1 row)

ROLLBACK


Can anyone suggest how I would go about getting the serial-number with xpath?

Thanks


Re: help with xpath namespace

From
Filip Rembiałkowski
Date:


2011/9/22 Brian Sherwood <bdsher@gmail.com>

select (xpath('/chassis-inventory/chassis/serial-number/text()',
       data_xml,
       ARRAY[ARRAY['junos',
'http://xml.juniper.net/junos/9.6R4/junos-chassis']]
      )) from xml_test;

Can anyone suggest how I would go about getting the serial-number with xpath?



http://www.postgresql.org/docs/9.1/static/functions-xml.html#FUNCTIONS-XML-PROCESSING - see "mydefns".

This will work:

select xpath(
    '/junos:chassis-inventory/junos:chassis/junos:serial-number/text()',
    data_xml,
    ARRAY[ARRAY['junos', 'http://xml.juniper.net/junos/9.6R4/junos-chassis']]
)
from xml_test;



cheers, Filip


Re: help with xpath namespace

From
Brian Sherwood
Date:
Yep, that did it.

Thanks!


2011/9/23 Filip Rembiałkowski <plk.zuber@gmail.com>:
>
>
> 2011/9/22 Brian Sherwood <bdsher@gmail.com>
>>
>> select (xpath('/chassis-inventory/chassis/serial-number/text()',
>>        data_xml,
>>        ARRAY[ARRAY['junos',
>> 'http://xml.juniper.net/junos/9.6R4/junos-chassis']]
>>       )) from xml_test;
>>
>> Can anyone suggest how I would go about getting the serial-number with
>> xpath?
>>
>
>
> http://www.postgresql.org/docs/9.1/static/functions-xml.html#FUNCTIONS-XML-PROCESSING
> - see "mydefns".
>
> This will work:
>
> select xpath(
>     '/junos:chassis-inventory/junos:chassis/junos:serial-number/text()',
>     data_xml,
>     ARRAY[ARRAY['junos',
> 'http://xml.juniper.net/junos/9.6R4/junos-chassis']]
> )
> from xml_test;
>
>
>
> cheers, Filip
>
>
>


Re: help with xpath namespace

From
Ross Reedstrom
Date:
On Mon, Sep 26, 2011 at 09:56:06AM -0400, Brian Sherwood wrote:
> Yep, that did it.
> 
> Thanks!

ProTip (for the list archive): since the namespace alias in the query and the
original XML don't need to match (in this common case, the document uses a
default namespace, which isn't available in xpaths), you can save significant
typing by using a single-character namespace:

select xpath(
    '/j:chassis-inventory/j:chassis/j:serial-number/text()',
    data_xml,
    ARRAY[ARRAY['j',
'http://xml.juniper.net/junos/9.6R4/junos-chassis']]
)
from xml_test;

Ross

> 
> 
> 2011/9/23 Filip Rembiałkowski <plk.zuber@gmail.com>:
> >
> >
> > 2011/9/22 Brian Sherwood <bdsher@gmail.com>
> >>
> >> select (xpath('/chassis-inventory/chassis/serial-number/text()',
> >>        data_xml,
> >>        ARRAY[ARRAY['junos',
> >> 'http://xml.juniper.net/junos/9.6R4/junos-chassis']]
> >>       )) from xml_test;
> >>
> >> Can anyone suggest how I would go about getting the serial-number with
> >> xpath?
> >>
> >
> >
> > http://www.postgresql.org/docs/9.1/static/functions-xml.html#FUNCTIONS-XML-PROCESSING
> > - see "mydefns".
> >
> > This will work:
> >
> > select xpath(
> >     '/junos:chassis-inventory/junos:chassis/junos:serial-number/text()',
> >     data_xml,
> >     ARRAY[ARRAY['junos',
> > 'http://xml.juniper.net/junos/9.6R4/junos-chassis']]
> > )
> > from xml_test;
> >
> >
> >
> > cheers, Filip
> >
> >
> >
> 
> -- 
> Sent via pgsql-sql mailing list (pgsql-sql@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-sql
>