Beefy Boxes and Bandwidth Generously Provided by pair Networks
more useful options
 
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 ( #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
Node Status?
node history
Node Type: note [id://1043227]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (10)
As of 2015-07-28 07:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (252 votes), past polls