удалить узлы XML с атрибутом в Perl - PullRequest
0 голосов
/ 07 мая 2018

Я новичок в 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 с атрибутом?

1 Ответ

0 голосов
/ 07 мая 2018

http://p3rl.org/xml_grep

xml_grep \
    --cond 'meassage[@name="error"]' \
    --cond 'meassage[@name="fail"]' \
    --cond 'meassage[@name="warning"]' \
    so50214597.xml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...