[Engine-devel] Issue with XML namespaces in engine-setup

Daniel Veillard veillard at redhat.com
Sat Apr 14 01:55:31 UTC 2012


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 at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/



More information about the Devel mailing list