Note that 'or die' is not necessary on the parse_file(). XML parsers will die if they try to parse bad XML. Also you might be able to get your desired nodes with just XPath (modifying ikegami's answer, but not tested):
for my $node ($root->findnodes("//ParagraphStyleRange[fn:contains(@App
+liedParagraphStyle, 'BODY TEXT']/CharacterStyleRange/Content")) {
say $node->textContent()
}
}