Другой идеей было бы загрузить XML :: DOM :: XPath , что делает такие запросы довольно естественными и менее подробными.
B узлов, которые являются потомками элемента документа:
@nodes = $doc->findnodes('/document/B');
B-узлы, которые являются дочерними по отношению к A-узлам, которые являются дочерними по отношению к документу:
@nodes = $doc->findnodes('/document/A/B');
B-узлы, которые являются непосредственными потомками A-узлов, встречающихся где угодно:
@nodes = $doc->findnodes('//A/B');
B узлов, которые являются потомками любого узла A:
@nodes = $doc->findnodes('//A//B');
B узлов, у которых есть один (ровно один) предок между ними и документом:
@nodes = $doc->findnodes('/document/*/B');
И многое другое! (Я добавил много вариантов, потому что из вашего вопроса не ясно, какие именно являются наиболее подходящими для вашей проблемы).
Поскольку все значения являются просто обычными объектами XML :: DOM с добавлением некоторых методов, вы можете смешивать и сопоставлять их с любым существующим кодом XML :: DOM практически без суеты.