logo       
Google Custom Search
    AddThis Social Bookmark Button
-->

Re: Re: SimpleXMLWriter vs. lxml performance: msg#00084

Subject: Re: Re: SimpleXMLWriter vs. lxml performance
Paul Everitt wrote:
> Stefan Behnel wrote:
>> Anyway, I don't know if it's a good idea to use XSLT here, since there 
>> may be too many 'ifs' and 'maybes'.
> 
> Ahh, too bad.  I was hoping to avoid an approach that only worked with 
> lxml.  But, if that's the way it is, that's the way it is.  Out of 
> curiosity, is it not a good idea based on the current state, or the 
> long-term plans as well?

As I said, if you want to test it, feel free. That way, we know what works and
what may have to be fixed. It may enable us to decide if it's worth 
implementing.


> Essentially, I'm looking for a way to bring new nodes into a document. 
> Similar to how XInclude does, but under programmatic control, and with the
> ability to do arguments.

XSLT supports arguments in functions, just like XPath does.


> I'd prefer to keep the integration point in a declarative document-oriented
> style, instead of a script-oriented style.  But it sounds like I might not
> be able to get there from here and I have to take what I can get. :^)
> 
>> But using element classes, you could do something like this (untested):
>>
>> ---------------------------
>> class MyDataFiller(ElementBase):
>>   def _init(self):
>>     child = self[0]
>>     if child.tag == 'sqlquery':
>>        query = child.text
>>        del self[0] # remove sqlquery element to prevent running this
>> twice
>>        # run SQL query, generate result child nodes for it
>>
>> Namespace('ns')['mydata'] = MyDataFiller
>>
>> xml = XML("""
>> <myroot xmlns='ns'>
>>   <mydata>
>>     <sqlquery>SELECT from ...</sqlquery>
>>   </mydata>
>> </myroot>
>> """)
>>
>> data = xml[0] # will call _init()
>> for data_child in data:
>>    # do something with data
>> ---------------------------
> 
> In the example above, is the _init called when the document is parsed,
> or when the element is traversed?

I updated the documentation regarding this point, but for a short answer:


> Stated differently, if I want to evaluate the query and get the new
> nodes, do I have to write some script to grab each node and "evaluate" it?

Yes. This is only done when a Python object is instantiated. Which means that
you may have to do something like this:

tree.xpath('//XPath expression to find all complex elements')

to instantiate them first.

Stefan


<Prev in Thread] Current Thread [Next in Thread>