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

时间:2012-12-10 22:23:07

标签: python xml perl sed awk

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

例如......

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

环境是RHEL-5,这意味着可以使用Python 2.4,Perl或SED / AWK解决方案。

有关如何移除垃圾的任何建议吗?

3 个答案:

答案 0 :(得分:2)

我建立了Birei关于检查树元素的建议,但提出了一个仅SED解决方案。如OP中所示,<cto>标签恰好位于一条连续线上。然后,解决方案是拆分行,使每个<cto>标记位于新行上 - 因此,也将新行上的垃圾二进制数据隔离 - 然后简单地选择以{{1开头的行标签。

可以通过CAT将<cto><tracks>标记添加到新文件中。

以下是我测试并确认可以使用的SED命令......

步骤1.将</tracks>标记隔离在新行上。

<cto>

步骤2.仅选择以sed -i "s/<cto/\n<cto/g;s/<\/cto>/<\/cto>\n/g" ${FILE} 标记开头的行。

<cto>

步骤3.格式化新的XML文档。

sed -i "/<cto/p" ${FILE}

感谢各自的投入。

答案 1 :(得分:1)

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

#!/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;

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

perl script.pl xmlfile

答案 2 :(得分:1)

这是一个快速的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";

您可以像这样管道您的曲目文本:

$:  cat track.txt | ./clean_track.pl 
<track><cto>Valid_XML_HERE</cto><cto>(...)</cto></track>