Beefy Boxes and Bandwidth Generously Provided by pair Networks
No such thing as a small change
 
PerlMonks  

Re^4: copyCurrentNode in XML::LibXML::Reader will add xmlns attribute ( setNamespaceDeclURI )

by choroba (Cardinal)
on Sep 20, 2017 at 11:45 UTC ( [id://1199726]=note: print w/replies, xml ) Need Help??


in reply to Re^3: copyCurrentNode in XML::LibXML::Reader will add xmlns attribute ( setNamespaceDeclURI )
in thread copyCurrentNode in XML::LibXML::Reader will add xmlns attribute

I don't get it. I experimented with $node->setNamespace(undef, undef, 1) which seems to be the simplest namespace handling fucntion, but I couldn't get it work.

XML::LibXML defines setNamespace in the following way:

sub setNamespace { my $self = shift; my $n = $self->nodeName; if ( $self->_setNamespace(@_) ){ if ( scalar @_ < 3 || $_[2] == 1 ){ $self->setNodeName( $n ); } return 1; } return 0; }

where _setNamespace comes from its XS component, the important part (I guess) is the following:

if ( nsPrefix == NULL && nsURI == NULL ) { /* special case: empty namespace */ if ( (ns = xmlSearchNs(node->doc, node, NULL)) && ( ns->href && xmlStrlen( ns->href ) != 0 ) ) { /* won't take it */ RETVAL = 0; } else if ( flag ) { /* no namespace */ xmlSetNs(node, NULL); RETVAL = 1; } else { RETVAL = 0; } }

setNamespace returns 1, so I guess it goes the "else if" branch, but the namespace isn't removed from the node. xmlSetNs comes from libxml2 and is defined as (debugging ifdefs removed)

void xmlSetNs(xmlNodePtr node, xmlNsPtr ns) { if (node == NULL) { return; } if ((node->type == XML_ELEMENT_NODE) || (node->type == XML_ATTRIBUTE_NODE)) node->ns = ns; }

Anyone can explain why the namespace isn't changed?

($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
  • Comment on Re^4: copyCurrentNode in XML::LibXML::Reader will add xmlns attribute ( setNamespaceDeclURI )
  • Select or Download Code

Replies are listed 'Best First'.
Re^5: copyCurrentNode in XML::LibXML::Reader will add xmlns attribute ( setNamespaceDeclURI )
by beech (Parson) on Sep 20, 2017 at 18:18 UTC

    Anyone can explain why the namespace isn't changed?

    Hi,

    Its some kind of bug, if I were setup to compile libxml2 I'd narrow it down with this addition to LibXML.xs

    int _setNamespaceNULL(self ) SV * self PREINIT: xmlNodePtr node = PmmSvNode(self); INIT: if ( node == NULL ) { croak( "lost node" ); } CODE: xmlSetNs(node, NULL); RETVAL = 1; OUTPUT: RETVAL
      My knowledge of C is less than basic (yes, I used Basic a lot as a child).

      But, I was able to compile the following and verify that libxml2 is able to clear the namespace, so the problem must lie in the XS land:

      #include <stdio.h> #include <libxml/tree.h> #include <libxml/parser.h> #include <libxml/xpath.h> #include <libxml/xpathInternals.h> int main (int argc, char **argv) { xmlInitParser(); xmlDoc *document; document = xmlParseDoc("<r xmlns:p='http://p.p'><p:a>HERE</p:a></r>" +); xmlXPathContext *xpc; xpc = xmlXPathNewContext(document); xmlXPathRegisterNs(xpc, "p", "http://p.p"); xmlXPathObject *xp; xp = xmlXPathEvalExpression("/r/p:a", xpc); if (xp == NULL) return(1); xmlNodeSet *nodes; nodes = xp->nodesetval; xmlNode *node; node = nodes->nodeTab[0]; xmlSetNs(node, NULL); xmlChar *s; int size; xmlDocDumpMemory(document, &s, &size); char *string; string = (char *)s; printf("%s", string); return(0); }

      Outputs:

      <?xml version="1.0"?> <r xmlns:p="http://p.p"><a>HERE</a></r>

      ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,
      Should work now.

      ($q=q:Sq=~/;[c](.)(.)/;chr(-||-|5+lengthSq)`"S|oS2"`map{chr |+ord }map{substrSq`S_+|`|}3E|-|`7**2-3:)=~y+S|`+$1,++print+eval$q,q,a,

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others wandering the Monastery: (6)
As of 2024-04-18 12:20 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found