Last active
August 29, 2015 14:11
-
-
Save dginev/828279d9689417d65a14 to your computer and use it in GitHub Desktop.
libxml 2.9.2 ID conflicts
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/perl/bin -w | |
use strict; | |
use warnings; | |
use XML::LibXML; | |
my $xml_content = <<EOL; | |
<?xml version="1.0" encoding="UTF-8"?> | |
<a xml:id="a"> | |
<b xml:id="b"></b> | |
</a> | |
EOL | |
my $dom = XML::LibXML->load_xml(string => $xml_content, no_blanks => 1); | |
my $a = $dom->documentElement; | |
my $b = $a->firstChild; | |
$b->unbindNode(); | |
my $c = $dom->createElement("c"); | |
$c->setAttributeNS('http://www.w3.org/XML/1998/namespace', 'id', "b"); | |
$a->appendChild($c); | |
print $dom->toString(1),"\n"; |
Oh, @dginev, so you get a notice! Ha!
For some reason it didn't even send me a notice ... Thanks for that, removeAttribute should do the trick, we just need to hunt down all positions where we unbind nodes (that we don't reuse later).
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I don't think the undef should be unsafe, since the DESTROY should only happen if the refcount goes to 0. If there is another reference, it simply won't get destroyed, and the id wont be cleaned up!
I asked on the xml list, and got some good response from Nick Wellnhofer. Basically he made the same suggestions you did! Namely either set to undef, remove the id. Or, also you could put the node into a new document:
but that would be expensive.
I'm inclined to think that removing the id is the best approach:
I believe you tested it, and that got rid of the errors? At least the ones from the place where it was used; I'll have to scan through and find all the places that need that treatment. Should just be a few...