Much as I hate to say it, it looks to me like all the problems you're having are coming from your data structure. Since you have a tree of data, would it make more sense to store it in a tree structure? Start with an array of volumes, with each entry in the array being the complete path and name of the XML file for that volume. Then add a hash where the keys are the XML file names, and the values are pointers to more hashes of hashes that contain the XML data.
Once you can load and save the XML files from the hashes (which won't be that bad with a little recursion) the display should be straightforward, because it mirrors the data structure.
If you can get a copy of "Mastering Algorithms with Perl" it has great stuff on data structures and examples of how they work.