Добавление текста, если отсутствует (Perl REGEXP) - PullRequest
0 голосов
/ 22 января 2012

Используя оператор замены Perl (s //), я бы хотел изменить XML, добавив атрибут к некоторым элементам, если он отсутствует.Вот пример:

...
<car color="red" owner="john">...</car>
<car color="green" age="3">...</car>
...

Допустим, я бы хотел добавить владельца по умолчанию к автомобилям без автопилота.Я безуспешно пробовал следующее:

s/(<car[^>]*)(?!owner="[^"]*")(.*>)|$1 owner="steve"$2/iUg

Любая помощь приветствуется.

Ответы [ 3 ]

5 голосов
/ 22 января 2012

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

Предложения Perl / CPAN включают:

  • XML::Simple

    Рассматривает ваш XML-документ как структуру данных Perl

  • XML::Parser

    Старыйтаймер

  • XML::SAX

    Для нужд SAX-анализа

  • XML::Twig

    Для эффективной обработки памяти XML-документов кусками

  • XML::LibXML

    Мой личный фаворит

1 голос
/ 22 января 2012

Я обычно использую XML :: XSH2 для манипулирования XML. Ваша проблема может быть легко решена в этом:

for //car[not(@owner)] set @owner "steve" ;
0 голосов
/ 22 января 2012

Вы можете попробовать это

#!/usr/bin/perl -w

$str = <<EOF;
<car color="red" owner="john">.*#?§<car color="pink"> </car>.*#?§</car>
<car color="green" age="3">.*#?§</car>
<car owner="bill"></car>
EOF

$str =~ s/(<car(?![^>]+?owner))([^>]*?)>/$1$2 owner="steve">/g;

print $str;

С наилучшими пожеланиями


PS: скорее всего, это опечатка, но в любом случае вертикальная черта в вашем регулярном выражении должна быть заменена косой чертой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...