After spending too-long telling myself that “XPath expressions can’t be ‘the right way’ to query an XML structure,” I have done a complete about-face. XPath is declarative way to ask for what you need to find, and it works. So, avoid writing code that is dependent upon the structure of the XML document, for the same reasons that you should avoid (hand-)writing recursive-descent parsers. (No, no, no hard-and-fast rules here, but the time you save will be your own.)
In the process, I have also settled on XML::LibXML.
This module is an interface to libxml2, which is the de facto binary library for managing “XML everything.” One of the main reasons why I like to use it, now, is that there’s a very good chance that I am using the same library, to do my part of the job, that my erstwhile data-exchange partner used, or will use, to do his.