В комментариях вы упомянули, что хотите что-то переносимое. Это замечательно, но я действительно настоятельно призываю вас не делать этого в любом случае. XML
является контекстным языком, а регулярное выражение - нет. В результате регулярное выражение не может правильно анализировать XML.
В лучшем случае вы получите хакер, который действителен только при условии, что XML остается в том же формате. Но поскольку спецификация XML говорит, что формат может случайно и сохранить ту же семантику, это опасное предположение и создает хрупкий код.
Я знаю, что у вас есть причины хотеть этого - у вас уже есть ответ, который дает вам возможность. Я бы предположил, что синтаксический анализатор по-прежнему является правильным ответом.
Но с синтаксическими анализаторами XML вы получаете xpath
- что очень похоже на регулярные выражения, но применимо к иерархической информации.
Примерно так:
#!/usr/bin/env perl
use strict;
use warnings;
use XML::Twig;
my $twig = XML::Twig -> parse ( \*DATA );
my $version = $twig -> get_xpath('//item/artifactId[string()="myproject"]/../version',0)->text;
print $version;
__DATA__
<xml>
<item>
<artifactId>myproject</artifactId>
<version>1.14.0-SNAPSHOT</version>
</item>
</xml>
Надеюсь, вы видите, как работает xpath
? // item
находит элемент в любом месте структуры. [string () =
запрашивает текстовое содержимое. Вместо этого вы можете сделать что-то вроде [@ someAtt = "fish"]
, чтобы проверить атрибут.
Затем мы ..
вверх (до элемент
) и получаем элемент версия
.
Затем получите значение текст
.
В качестве единственного советника:
perl -MXML::Twig -0777 -e 'print XML::Twig -> parse ( <> ) -> get_xpath('/item/artifactId[string()="myproject"]/../version',0)->text,"\n" yourxmlfile.xml
Теперь я предлагаю XML :: Twig
, потому что я думаю, что его легче выучить. XML :: LibXML
тоже неплох.
Но он распространяется с клубничным Perl в Windows и легко доступен во многих менеджерах пакетов - или из CPAN
.
В качестве альтернативы - xmlstarlet
должен позволить вам делать то же самое.