Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re^7: How to parse xml with namespase vale in XMl:LibXML? (autoRegisterNs)

by Anonymous Monk
on Jul 09, 2013 at 02:42 UTC ( [id://1043227]=note: print w/replies, xml ) Need Help??


in reply to Re^6: How to parse xml with namespase vale in XMl:LibXML? (xmllint --shell setns / xpathtester)
in thread How to parse xml with namespase value in XMl:LibXML?

Probably ought to store the context in the ROOT, oh well

#!/usr/bin/perl -- use strict; use warnings; use XML::LibXML; use Data::Dump qw/ dd pp /; Main( @ARGV ); exit( 0 ); sub ROOTNS { my( $self ) = @_; $::xpcroot = ROOT( $self ); $::xpc = XML::LibXML::XPathContext->new( ); for my $node ( $::xpcroot->F('//*') ){ for my $att( $node->attributes() ){ if( $att->isa( "XML::LibXML::Namespace" ) ){ my $suffix = $att->localname; my $value = $att->value; print '# autoRegisterNs( ', pp( $suffix ), ' => ', pp( + $value ) , " );\n"; $::xpc->registerNs( $suffix => $value ); } } } } sub ROOT { my( $self ) = @_; my $parent = $self; while( my $newparent = $parent->getParentNode ){ $parent = $newparent; } return $parent; } BEGIN { $::xpc = XML::LibXML::XPathContext->new(); sub XML::LibXML::Node::F { my( $self, $xpath, $context ) = @_; unless( $::xpcroot and $::xpcroot == ROOT( $self ) ){ ROOTNS( $self ); } $::xpc->findnodes( $xpath, $context || $self ); } } sub Main { my $dom = XML::LibXML->new( qw/ recover 2 / )->load_xml( string => q{<?xml version="1.0" ?> <book xmlns:book="http://generated.ns/book" xmlns:xlink="http://www.w3 +.org/1999/xlink"> <book:chapter id="bk444444ch1" type="CHAPTER"> <book:locator xlink:href="/book/isbn/979-0-4444-1000-17/book-part/ +chapter/bk444444ch1?releaseStatus=RELEASED" xlink:title="Photonic cry +stal light-emitting sources" xlink:type="locator"></book:locator> <book:locator xlink:href="/book/isbn/979-0-4444-1000-17/book-part/ +chapter/bk444444ch1?releaseStatus=RELEASED&amp;format=pdf" xlink:titl +e="Photonic crystal light-emitting sources" xlink:type="locator"></bo +ok:locator> <book:locator xlink:href="/book/isbn/979-0-4444-1000-17/book-part/ +chapter/bk444444ch1?releaseStatus=RELEASED&amp;format=epub" xlink:tit +le="Photonic crystal light-emitting sources" xlink:type="locator"></b +ook:locator> </book:chapter> </book>}, ); print $_->nodePath,"\n" for $dom->F(q{//book:locator/@xlink:href}) +; } __END__ # autoRegisterNs( "book" => "http://generated.ns/book" ); # autoRegisterNs( "xlink" => "http://www.w3.org/1999/xlink" ); /book/book:chapter/book:locator[1]/@xlink:href /book/book:chapter/book:locator[2]/@xlink:href /book/book:chapter/book:locator[3]/@xlink:href
  • Comment on Re^7: How to parse xml with namespase vale in XMl:LibXML? (autoRegisterNs)
  • Download Code

Replies are listed 'Best First'.
Re^8: How to parse xml with namespase vale in XMl:LibXML? (autoRegisterNs)
by Anonymous Monk on Jul 09, 2013 at 04:46 UTC
    A twist in the smae context. what could be the tweak if we want to caputue values of "xlink:href" and "xlink:title" if "xlink:href" ends with "releaseStatus=RELEASED"?
      lol, figure it out
Re^8: How to parse xml with namespase vale in XMl:LibXML? (autoRegisterNs )
by Anonymous Monk on Jul 13, 2013 at 23:11 UTC
    FWIW, this autoRegisterNs is completely unneccessary with the xml included in the program, but if you remove   xmlns:book="http://generated.ns/book" xmlns:xlink="http://www.w3.org/1999/xlink" then it becomes neccessary

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://1043227]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others romping around the Monastery: (2)
As of 2024-04-19 21:15 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found