操作格式良好的xml(在linux下运行的任何语言)

mar*_*ema 1 ruby python xml perl

我有格式良好的xml(开放标签已关闭等),但没有dtd,名称空间并不总是正确的,并且有随机实体.

我在一些xml文件中发现了一个错误,并想自动解决这个问题.基本上,xml文件如下所示:

<foo>
  <bar>      hi </bar>
  <!-- ... -->
  <math><sometag><another>bar</another></sometag></math>
  <!-- ... -->
</foo>
Run Code Online (Sandbox Code Playgroud)

我想改成这个

<foo>
  <bar>      hi </bar>
  <!-- ... -->
  <m:math><m:sometag><m:another>bar</m:another></m:sometag></m:math>
  <!-- ... -->
</foo>
Run Code Online (Sandbox Code Playgroud)

我查看了Python elementtree,但根据diveintopython,它不会喜欢它不验证xml的事实?此外,重要的是除了前缀之外不应该更改任何内容m:.

因为我正在编写一堆shell脚本来修复文件,所以我并不真正关心语言,尽管我目前选择的武器是Python.

澄清:

  • xml在执行xmllint时会传递
  • 我真的想要一个xml解决方案,因为使用正则表达式解析xml是很好的方法
  • 我不知道可以在<math>和之间的标签的名称</math>
  • 上述标签的前缀,不应对文件进行修改m:

mir*_*rod 6

在Perl中,您可以使用XML :: Twig,例如:

#!/usr/bin/perl

use strict;
use warnings;

use XML::Twig;

XML::Twig->new( twig_roots => { math => \&add_prefix },
                twig_print_outside_roots => 1,
              )
         ->parse( \*DATA);

sub add_prefix
  { my( $t, $math)= @_;
    foreach my $m ( $math, $math->descendants( '#ELT'))
      { $m->set_tag( "m:" . $m->tag); }
    $t->flush;
  }

__DATA__
<foo>
  <bar>      hi </bar>
  <!-- ... -->
  <math><sometag><another>bar</another></sometag></math>
  <!-- ... -->
</foo>
Run Code Online (Sandbox Code Playgroud)