In my previous entry I said "When you compare the weary nature of, say Java XML data bindings, Amara is a nice advertisement for Python's dynamicism." Interestingly, Eric van der Vlist recently mentioned to me a project in which he attempts to address some of these deficiencies within Java. TreeBind, is "yet another XML <-> Java binding API." The TreeBind page says:
The difference between TreeBind and most of the other Java binding APIs is that we've tried to minimize the need for any type of schema or configuration file and to maximize the usage of introspection of Java classes in order to facilitate the integration with existing classes."
It's about time, but is Java's introspection really enough? It doesn't save you from welding to Java's type rigidity.
It makes me recall Wolfgang Hoschek's response to one of my Amara announcements on XML-DEV. The Amara example was:
The following is complete code for iterating through address labels in an XML document, while never loading more memory than needed to hold one label element:
from amara import binderytools for subtree in binderytools.pushbind('/labels/label', source='labels.xml'): print subtree.label.name, 'of', subtree.label.address.city
And Wolfgang responded:
Very handy!
FYI, analog example Java code for the current Nux version reads as follows:
StreamingTransform myTransform = new StreamingTransform() { public Nodes transform(Element subtree) { System.out.println(XQueryUtil.xquery(subtree, "name").get(0).getValue()); System.out.println("of"); System.out.println(XQueryUtil.xquery(subtree, "address/city").get(0).getValue()); return new Nodes(); // mark current element as subject to garbage collection } }; Builder builder = new Builder(new StreamingPathFilter("/labels/label", null). createNodeFactory(null, myTransform)); //[Line split by Uche for formatting reasons] builder.build(new File("labels.xml"));
It's not as compact as with Amara, but still quite handy...
This is certainly a great leap forward from Java/XML APIs I've seen, even from plain XOM. I'd expect a similar leap, albeit in a different direction, in TreeBind. But in my biased opinion, even such impressive leaps lose a lot of luster when compared to the gains in expressiveness provided by the Python example. Line count is just a bit of the picture. For overall idiom, and the amount of conceptual load buried in each construct, it's hard to even place the Python and Java examples on the same scale.
In here, I think, is the crux of where dynamic language advocates are unimpressed by the productivity gains claimed by XQuery advocates. Productivity gained through declarativity should complement rather than interfere with productivity gained through natural, expressive idiom. XQuery does not meet this test. By imposing a ponderous type framework over XML it provides productivity on one hand while stifling the power of dynamic languages. this is why in Amara I seek to harness the declarative power of unencumbered little languages such as XPath and XSLT patterns to the expressive power of Python. I think this gives us a huge head start over systems using XQuery and Java introspection to tame the chore of XML processing.
See also: