Re: [xml] ID already defined in 2.9.2



On 12/18/2014 09:01 AM, Nick Wellnhofer wrote:
On 18/12/2014 12:37, Bruce Miller wrote:
Hi all;
   I've seen a bug report
(https://bugzilla.gnome.org/show_bug.cgi?id=737840#c4)
regarding a new error about ID's already defined that turned
up with 2.9.2, but we're encountering a somewhat different manifestation.

In the Perl program below (using XML::LibXML), we basically want
to replace an element that has an ID, with another element that
(ultimately) should have the same ID.

Unfortunately, when linked to libxml2 2.9.2, this results in an error:
   element c: validity error : ID b is already defined

Yes, this is a different manifestation.

The documentation of (XML::LibXML::Node) unbindNode makes clear
that it removes the node from the dom tree, but it is still
associated with the Document. It is not unreasonable to think
that the Document should remember that the ID is "defined";
and in fact it's not necessarily a bad thing that libxml2
should be checking that.

However, this never resulted in an error until 2.9.2.
So, I'm not sure whether this is necessarily a bug
report on 2.9.2, or a request for suggestions on how
best (via XML::LibXML) to cleanly _remove_ the record
of the id from the Document.

To work around this error, you can simply force the unbound node to be
destroyed by removing any references to it. In your example program, add
`$b = undef` after `$b->unbindNode()`. Alternatively, you could remove
the `id` attribute after unbinding a node.

[So, the DESTROY method _does_ remove the ID from the document?]

Actually, we'd thought of both of those methods,
although we weren't completely sure they'd work.

Worse, is making sure that nowhere (esp. on the stack),
somebody's holding a ref to the node; they won't be
assuming it's still part of the document, but might
still want access to the information that was there....

If there's no other method, we'll just have to be careful!

Thanks;
bruce

Of course, this only works if you really want to remove the node. It
seems that libxml2 doesn't provide a useful mechanism to move ID
attributes from one document to another. I think that `xmlSetTreeDoc`
should be changed to account for added and removed IDs.

Nick



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]