You may want to look at libxml2's xmlTextReader "streaming" interface.
It's a foward-moving cursor that discards input data it has already processed, and doesn't build a large, memory intensive DOM as it moves forward. XPath queries can still be used, with the limitation that subtrees must be expanded (i.e., copied into in-memory libxml structures) for parts of the document that are to be searched.
The xmlTextReader interface is much more tedious than just throwing a few XPath queries at the root element, but for a document that size, on a device that's memory constrained, it may be your best bet.
I've just finished a conversion to xmlTextReader for similar reasons, and the memory used during XML processing is identical for a 20KB and 30MB document.