如何使用 unix 在 XML 文件中的特定标记之间添加或替换特定字段

发布于 2024-11-27 14:22:55 字数 576 浏览 1 评论 0原文

我在下面给出的文件格式中有 XML 文件,

 <Open> 

 <ID>7175</ID> 

    <Name>GEENU</Name> 

    <Description>CHUMMA</Description> 

    <Active>1</Active> 

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

我想添加或替换特定标记中的某些字段。例如,我想在标签中存在的“CHUMMA”旁边添加“,GEENU”。

<Open> 

<ID>7175</ID> 

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

I have XML file inside that file format which is given below is present

 <Open> 

 <ID>7175</ID> 

    <Name>GEENU</Name> 

    <Description>CHUMMA</Description> 

    <Active>1</Active> 

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

I want to add or replace some field which is coming in specific tag. For Example, i want to add ",GEENU" next to "CHUMMA" which is present in tag.

<Open> 

<ID>7175</ID> 

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

爱她像谁 2024-12-04 14:22:55

这是使用 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>

Here is a solution using 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;

It prints:

<Open>
  <ID>7175</ID>
  <Name>GEENU</Name>
  <Description>CHUMMA,GEENU</Description>
  <Active>1</Active>
  <Users>1</Users>
</Open>
巷子口的你 2024-12-04 14:22:55

在非常简单的场景中,您可以:

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 库。

In very simple scenario, you can:

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

But it have a bunch of limitations:

  1. tag must be opened and closed in the same line
  2. no nested tag support
  3. potential conflict with characters in value and sed separator ("|" here)

For real XML processing, use real XML libraries in language you know.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文