Я новичок в Perl, и у меня много XML
файлов с такой же структурой:
<reult>
<test name="test1">
<meassage type="passed">
<description><![CDATA[ ===>> passed is here]]></description>
</meassage>
<check name="" line="150">
<result type="text"></result>
<description type="DETAILED"></description>
</check>
<meassage type="error">
<description><![CDATA[ ===>> error is here]]></description>
</meassage>
<meassage type="passed">
<description><![CDATA[ ===>> passed is here]]></description>
</meassage>
</test>
<test name="test2">
<meassage type="warning">
<description><![CDATA[ ===>> warning is here]]></description>
</meassage>
<meassage type="fail">
<description><![CDATA[ ===>> fail is here]]></description>
</meassage>
<meassage type="passed">
<description><![CDATA[ ===>> passed is here]]></description>
</meassage>
<check name="" line="100">
<result type="text"></result>
<description type="DETAILED"></description>
</check>
</test>
</reult>
Что я хочу сделать, так это прочитать каждый тест с использованием for
, а затем удалить все ноды сообщения, которые не имеют значения для меня. Это означает, что все узлы, не имеющие атрибутов «fail», «error» и «warning» в качестве атрибута, должны быть удалены.
Я начал делать с удалением всех дочерних элементов теста с сообщением, но оно удалит то, что должно остаться. Вот основная часть кода только для удаления, которую я не смог понять.
my $cut_name = 'message';
my $xml_file = 'test.xml';
my $mainXml = XML::Simple::Tree->new( file => $xml_file,
node_key => 'directory',
target_key => 'name');
$mainXml->cut_node($cut_name);
После удаления всех нерелевантных узлов я сохраню результат как новый файл XML
.
Кстати, не могли бы вы сообщить мне, как я могу удалить узлы, используя splice с атрибутом?