Как добавить или заменить определенное поле между определенным тегом, который входит в XML-файл, используя Unix - PullRequest
1 голос
/ 04 августа 2011

У меня есть XML-файл внутри того формата, который указан ниже.

 <Open> 

 <ID>7175</ID> 

    <Name>GEENU</Name> 

    <Description>CHUMMA</Description> 

    <Active>1</Active> 

    <Users>1</Users>
</Open> 

Я хочу добавить или заменить какое-то поле, которое входит в определенный тег.Например, я хочу добавить ", GEENU" рядом с "CHUMMA", который присутствует в теге.

<Open> 

<ID>7175</ID> 

<Name>GEENU</Name> 
    <Description>CHUMMA,GEENU</Description> 
    <Active>1</Active> 
    <Users>1</Users> 
</Open> 

Ответы [ 2 ]

4 голосов
/ 04 августа 2011

Вот решение, использующее XML :: Twig :

use XML::Twig;

my $xml = <<END_XML;
<Open>
    <ID>7175</ID>
    <Name>GEENU</Name>
    <Description>CHUMMA</Description>
    <Active>1</Active>
    <Users>1</Users>
</Open>
END_XML

my $twig = XML::Twig->new(
    twig_handlers => {
        Description => sub {
            my $text = $_->trimmed_text();
            if($text eq 'CHUMMA') {
                $_->set_text($text . ',GEENU');
            }
        },
    },
    pretty_print => 'indented',
);
$twig->parse($xml);
$twig->print;

Он печатает:

<Open>
  <ID>7175</ID>
  <Name>GEENU</Name>
  <Description>CHUMMA,GEENU</Description>
  <Active>1</Active>
  <Users>1</Users>
</Open>
2 голосов
/ 04 августа 2011

В очень простом сценарии вы можете:

TAG="Description"
OLDVAL="CHUMMA"
NEWVAL="CHUMMA,GEENU"
sed "s|<$TAG>$OLDVAL</$TAG>|<$TAG>$NEWVAL</$TAG>|g" -i my.xml

Но у него есть ряд ограничений:

  1. тег должен открываться и закрываться в одной строке
  2. нет поддержки вложенных тегов
  3. потенциальный конфликт с символами в значении и разделителем sed (здесь "|")

Для реальной обработки XML используйте настоящие библиотеки XML на языке, который вы знаете.

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