That looks like something
XML::Parser would be able to grok...
I've just finished a quick project with it, and while it's intimidating at first, it's quite powerful. It has a few different parsing "styles". I'd suggest you use
Subs, where you can have a sub for each tag in your XML, and since you know exactly which tags to expect, it makes it easy to write the subs to assign the data values.
Or, you can use the
Stream style, that will provide more flexibility, as it calls pre-defined subs on specific events (start tag, end tag, text, start document, etc), and from there you can verify which is the tag that is being parsed.
There's some more information
here and
here.