XML::Parser
передает информацию об атрибуте обработчику обратного вызова Start
в правильном порядке.Атрибуты появляются в вашей программе не по порядку, потому что вы помещаете их в хеш в строке
my ($self, $tag, %attrs) = @_;
, который теряет порядок.
XML::Parser
редко используется сам по себе,Вы можете использовать XML::Twig
, но я предпочитаю XML::LibXML
.
Вы не говорите, какие преобразования вы хотите сделать с данными, но эта программа воспроизводит ввод отдельно от(произвольно выбранный) элемент <subject>
, который он удаляет.Обратите внимание на простое использование нотации XPath для манипулирования документом и множественные атрибуты элемента <from>
, которые хранятся в порядке.
use strict;
use warnings;
use XML::LibXML;
my $doc = XML::LibXML->load_xml(string => <<XML);
<?xml version="1.0"?>
<messages>
<message>
<from id="t_8ur9k0" type="king" b="b" c="c" d="d" e="e" f="f" g="g">Maximus </from>
<to>knave</to>
<subject>My boots</subject>
<body>I <i>really</i> want my riding boots. Bring them to me, at once!</body>
</message>
</messages>
XML
my @nodes = $doc->findnodes('/messages/message/subject');
$nodes[0]->unbindNode;
print $doc->toString;
output
<?xml version="1.0"?>
<messages>
<message>
<from id="t_8ur9k0" type="king" b="b" c="c" d="d" e="e" f="f" g="g">Maximus </from>
<to>knave</to>
<body>I <i>really</i> want my riding boots. Bring them to me, at once!</body>
</message>
</messages>
ОБНОВЛЕНИЕ
Это демонстрация изменения всех текстовых узлов независимо от структуры документа
use strict;
use warnings;
use XML::LibXML;
my $doc = XML::LibXML->load_xml(string => <<XML);
<?xml version="1.0"?>
<messages>
<message>
<from id="t_8ur9k0" type="king" b="b" c="c" d="d" e="e" f="f" g="g">Maximus </from>
<to>knave</to>
<subject>My boots</subject>
<body>I <i>really</i> want my riding boots. Bring them to me, at once!</body>
</message>
</messages>
XML
my @nodes = $doc->findnodes('//text()');
$_->setData(lc $_->data) for @nodes;
print $doc->toString;
вывод
<?xml version="1.0"?>
<messages>
<message>
<from id="t_8ur9k0" type="king" b="b" c="c" d="d" e="e" f="f" g="g">maximus </from>
<to>knave</to>
<subject>my boots</subject>
<body>i <i>really</i> want my riding boots. bring them to me, at once!</body>
</message>
</messages>