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

标签 python ruby xml perl

我有格式正确的 xml(打开标签关闭等),但没有 dtd,命名空间并不总是正确的,并且有随机实体。

我在我的一些 xml 文件中发现了一个错误,并且想自动修复它。本质上,xml 文件如下所示:

<foo>
  <bar>      hi </bar>
  <!-- ... -->
  <math><sometag><another>bar</another></sometag></math>
  <!-- ... -->
</foo>

我想把这个改成

<foo>
  <bar>      hi </bar>
  <!-- ... -->
  <m:math><m:sometag><m:another>bar</m:another></m:sometag></m:math>
  <!-- ... -->
</foo>

我查看了 Python elementtree,但根据 diveintopython,它不会喜欢它不验证 xml 的事实吗?此外,重要的是,除了前缀 m: 之外,什么都不应该改变。 .

因为我正在编写一堆 shell 脚本来修复文件,所以我不太喜欢这种语言,尽管我目前选择的武器是 Python。

说明:

  • 在其上执行 xmllint 时 xml 确实通过了
  • 我真的想要一个 xml 解决方案,因为使用正则表达式解析 xml 是一种古怪的方式
  • 我不知道可以在 <math> 之间的标签名称和 </math>
  • 不应对文档进行任何修改除了上述标签的前缀为m:

最佳答案

在 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>

关于python - 操作格式良好的 xml(在 linux 下运行的任何语言),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5351382/

相关文章:

python - 使用有序字典作为有序集

ruby - 如果需要,如何自动安装 Ruby gem?

python - 使用 Blobstore 解析 App Engine 中大型 XML 文件的各个部分?

php - Python + PHP + Lighttpd?

Python 2 到 3 转换 : iterating over lines in subprocess stdout

ruby - 如何从 rspec 测试中提高标准错误?

Ruby Net::SCP 下载要求输入密码然后失败

C# - 在另一个类中调用/编写反序列化方法

c# - XmlSerializer 不使用在类上定义的 XmlRoot

python - Django datetime.timedelta ,如果它们可能是不同的集合,它如何从 timezone.now() 中减去