如何从外部有效的XML标记中删除垃圾邮件?

2024-04-26 10:54:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一系列从数据回放实用程序生成的XML文件。该实用程序生成格式正确的XML标记。不幸的是,实用程序并不完美。它试图序列化的一些Java对象失败了,它们被简单地插入(作为二进制blob)在这些其他有效的XML标记之间。在

例如。。。在

<track>
<cto>Valid_XML_HERE</cto>@Binary_Blob_of_Junk@<cto>(...)</cto>
</track>

环境是RHEL-5,这意味着Python2.4、Perl或SED/AWK解决方案是可用的。在

关于如何清除垃圾有什么建议吗?在


Tags: 文件数据对象标记实用程序序列化here格式
3条回答

下面是一个快速的Perl解决方案。在

#!/usr/bin/perl -Tw

use strict;
use warnings;
use English qw( -no_match_vars $INPUT_RECORD_SEPARATOR );

my $text = do { local $INPUT_RECORD_SEPARATOR = undef; <>; };

my @ctos = $text =~ m{<cto>( .+? )</cto>}xmsg;

if ( @ctos ) {

    printf '<track><cto>%s</cto></track>', join '</cto><cto>', @ctos;
}

print "\n";

您可以将曲目文本通过管道传送,如下所示:

^{pr2}$

使用XML::Twig解析器删除track标记文本的其他方法:

#!/usr/bin/env perl

use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig->new(
    twig_handlers => {
        track => sub {
            for my $t ( $_->children() ) { 
                if ( $t->is_text ) { 
                    $t->set_text( '' );
                }   
            }   
        }   
    },  
    pretty_print => 'indented',
)->parsefile( shift)->print;

以文件作为第一个(也是唯一的)参数运行它:

^{pr2}$

我根据Birei的建议来检查树元素,但是我想出了一个只有SED的解决方案。如OP中所示,<cto>标记正好在一条连续的线上。因此,解决方案是拆分行,这样每个<cto>标记都在一个新行上,这样也隔离了新行上的垃圾二进制数据,然后简单地选择以<cto>标记开头的行。在

<tracks></tracks>标记可以通过CAT简单地添加到新文件中。在

下面是我已经测试并确认可以工作的SED命令。。。在

第1步。将<cto>标记隔离到新行上。在

sed -i "s/<cto/\n<cto/g;s/<\/cto>/<\/cto>\n/g" ${FILE}

第二步。只选择以<cto>标记开头的行。在

^{pr2}$

第三步。格式化新的XML文档。在

xmllint  format "${FILE}" > foo.xml

感谢你们各自的投入。在

相关问题 更多 >