Fun With Old XML Features
Wed Apr 03 01:35:55 EDT 2013
One of the side effects of working on the OpenNTF Domino API is that I saw every method in the interfaces, including ones that were either new to me or that I had forgotten about a long time ago. One of these is the "parseXML" method found on Items, RichTextItems, and EmbeddedObjects. This was added back in 5.0.3, I assume for some reason related to the mail template, like everything else added back then. Basically, it takes either the contents of a text item, the text of a rich text item, or the contents of an attached XML document and converts it to an org.w3c.dom.Document object (the usual Java standard for dealing with XML docs).
That's actually kind of cool on its own in some edge cases (along with the accompanying transformXML method), but you can also combine it with ANOTHER little-utilized feature: XPath support in XPages. So say you have an XML document like this attached to a Notes doc (or stored in an Item):
<stuff> <thing> <foo>bar</foo> </thing> <thing> <foo>baz</foo> </thing> </stuff>
Once you have that, you can write code like this*:
<?xml version="1.0" encoding="UTF-8"?> <xp:view xmlns:xp="http://www.ibm.com/xsp/core"> <xp:this.data> <xp:dominoDocument var="doc" formName="Doc" action="openDocument"> <xp:this.postOpenDocument><![CDATA[#{javascript: requestScope.put("xmlDoc", doc.getDocument().getFirstItem("Attachment").getEmbeddedObjects()[0].parseXML(false)) }]]></xp:this.postOpenDocument> </xp:dominoDocument> </xp:this.data> <xp:repeat value="#{xpath:xmlDoc:stuff/thing}" var="thing"> <p><xp:text value="#{xpath:thing:foo}"/></p> </xp:repeat> </xp:view>
I don't really have any immediate use to do this kind of thing, but sometimes it's just fun to explore what the platform lets you do. It's one more thing I'll keep in the back of my mind as a potential technique if the right situation arises.
* Never write code like this.