как найти значение тега в xml файле и вывести два других значения тега в том же xml файле

Я хочу найти в grep значение тега of и если оно 01, то вывести другой тег и его значение.

Пример XML файла :

<CustName>Unix</CustName>
<CustomerId>999</CustomerId>
<dept>developer</dept>
<account>01</account>

Желаемый результат :

Если значение счета равно 01, то он должен вывести следующее и общее количество случаев появления значения 01 в теге account:

<CustName>Unix</CustName>
<CustomerId>999</CustomerId>
<account>01</account>

count :1

Что я пробовал :

grep -oP '(? <=<<account>).*(?=<</account)' cust.xml

01

grep -C 10 -oP '(?<=<account>).*(?=<</account)' cust.xml

-C 10 выведет 10 строк выше и ниже, но это не сработало.

0
19.07.2016, 21:53
1 ответ

Не используйте grep или регулярные выражения вообще. Это очень плохой выбор для работы с XML , потому что XML является контекстным, а регулярные выражения - нет. Вы никогда не получите хрупкого раствора.

Однако существуют и другие варианты. Лично мне нравится perl . Боюсь, я немного изменил ваш XML, потому что то, что вы опубликовали, недействительно. Вам НУЖЕН корневой тег, если ничего больше.

Однако что-то вроде этого будет делать то, что вы хотите:

#!/usr/bin/env perl
use strict;
use warnings 'all'; 

use XML::Twig;

#parse from 'data' block below. You probably want 'parsefile'. 
my $twig = XML::Twig -> parse ( \*DATA ); 
#set output formatting - one of the reasons why regex is prone to fail. 
$twig -> set_pretty_print ('indented_a');

#XPATH is _like_ regex, but for xml. 
#So in the below - we find 'acc' nodes, with an account with a string value of '01'. 
#And then print it.

foreach my $acc ( $twig -> get_xpath('//acc/account[string()="01"]/..' )) {
   $acc -> print;
}


#doing this a slightly different way - you could just increment the count
#in the above loop though
my $count = scalar $twig -> get_xpath('//account[string()="01"]');
print "\nNumber of matches: $count\n";

__DATA__
<root>
  <acc>
     <CustName>Unix</CustName>
     <CustomerId>999</CustomerId>
     <dept>developer</dept>
     <account>01</account>
  </acc>
  <acc>
     <CustName>Windows</CustName>
     <CustomerId>666</CustomerId>
     <dept>developer</dept>
     <account>02</account>
  </acc>
</root>

Дайте нам более полный образец XML и желаемый результат, и мы сможем собрать что-то более точное для того, что вы пытаетесь сделать.

Но, пожалуйста, не используйте регулярные выражения, они просто не могут правильно обрабатывать XML. Это похоже на использование молотка, чтобы вкрутить шуруп в стену - это вроде работает, но ничего другого, кроме беспорядка, не будет ... а отвертки легко доступны.

0
28.01.2020, 04:50

Теги

Похожие вопросы