On Fri, Mar 05, 2010 at 02:26:59PM +0300, Alexandre Snarskii wrote: > On Wed, Jan 28, 2009 at 03:40:10PM -0500, Ross Vandegrift wrote: > > Can you do that without providing a map that maps the abbreviated > > namespace back to the fully-qualified namespace? If so, I'd love to > > know how. > > Just run into the same problem myself, and workaround is here: > you can use local-name() function to do namespace-agnostic > searches, and you can use partial checks on namespaces to be > sure that you getting what you want. > > Example: iterate over physical interfaces: > > <xsl:for-each select="//*[local-name()='physical-interface' and > starts-with(namespace-uri(), 'http://xml.juniper.net/junos/')]"> > > Select operational state: > > <xsl:variable name="oper" > select="normalize-space(*[local-name()='oper-status'])"/> > > Select dropped packets for first queue: > > > select="normalize-space(*[local-name()='queue-counters']/*[local-name()='queue' > and > *[local-name()='queue-number']=0]/*[local-name()='queue-counters-red-packets'])"/> > > > Syntax is ugly, but it works...
I've been meaning to write up my solution to this, but haven't had the
chance. It turns out that lxml exposes namespace assignments in a
programmatically accessible manner.
Building the map I mention above ends up being very easy and means I
can rid myself of all the absurd XSLT mangling I had to do. I wish
the exposure of the namespace information had been more clearly
documented - or that I had noticed it earlier!
For Python folks, suppose that ncdoc is a netconf document. Then
here's the quick version of how to build an appropriate map of
specific namespaces from a given JUNOS response:
namepsaces = set()
nsmap = dict()
for i in ncdoc.getiterator():
namespaces.update(set(i.nsmap.values()))
for ns in namespaces:
shortname = ns.split('/')[-1]
nsmap[shortname]
# Now you can use normal XML tree traversal techniques
e = nsdoc.getroot()
name = e.xpath("./junos-interface:name/text()", namespaces=nsmap)
operstat = e.xpath("./junos-interface:oper-status/text()", namespaces=nsmap)
...etc...
This should works for any JUNOS platform that uses the consistent
namespace abbreviations we're all used to reading. Hopefully that's
all of them, forever :)
Ross
--
Ross Vandegrift
[email protected]
"If the fight gets hot, the songs get hotter. If the going gets tough,
the songs get tougher."
--Woody Guthrie
signature.asc
Description: Digital signature
_______________________________________________ juniper-nsp mailing list [email protected] https://puck.nether.net/mailman/listinfo/juniper-nsp

