
On Fri, Apr 13, 2012 at 07:59:32PM +0200, Juan Hernandez wrote:
On 04/12/2012 07:18 AM, Daniel Veillard wrote:
On Tue, Apr 10, 2012 at 01:54:51PM +0200, Juan Hernandez wrote:
Hello,
The code that we use in engine-setup to modify JBoss AS XML configuration files uses the following pattern:
datasourceStr = ''' <datasource ...> ... </datasource> '''
xmlObj.addNodes("//datasource:subsystem/datasource:datasources", datasourceStr)
This looks correct but is in fact generating a incorrect XML document, as the tags being added are not associated to a namespace. The resulting XML file will be correct, but the temporary representation in memory is not. This causes problems if you later, before writing out the modified file, try to use xpath expressions matching the added nodes: there will be no match.
I would suggest that we change the pattern to something like this:
datasourceStr = ''' <any_dummy_tag xmlns="urn:jboss:domain:datasources:1.0"> <datasource ...> ... </datasource> </any_dummy_tag> ''' datasourceNodes = libxml2.parseDoc(datasourceStr).getRootElement().children
xmlObje.addNodes("//datasource:subsystem/datasource:datasources", datasourceNodes)
This way both the representation in memory and the resulting file are correct.
Le me know what you think.
I think it's dangerous to move nodes from one document to another especially if there is namespaces (I assume you're operating in an environment on top of libxml2 as I saw a reference to it ;-)
For libxml2 there is an API in C: http://xmlsoft.org/html/libxml-parser.html#xmlParseInNodeContext which could do what you expect. Maybe there is a binding/wrapper available you could use.
Thanks Daniel, that looks certainly better/easier than what I am proposing. We use libxml2-python, but I can't locate that method there. Do you know if it is possible to use it from python?
Argh, right it's missing :-( the bindings could not be automatically generated. I need to add this but before it's deployed it will take a while, too bad that was the right way to do it :-\ To get back to your original problem, I would suggest to correct explicitely the namespaces on the nodes rather than move them from an external document, this feel less risky. The lxml python bindings around libxml2 [1] try to avoid such issues by making sure all documents share the same dictionary and control the copy operations, but I don't know if Stefan Behnel managed to cover all the cases Daniel [1] http://lxml.de/ -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/