2

我有一系列从数据回放实用程序生成的 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 解决方案。

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

4

3 回答 3

2

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

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

这是我已经测试并确认可以工作的 SED 命令...

步骤 1. 将标签隔离<cto>在新行上。

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

<cto>步骤 2. 仅选择以标签开头的行。

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

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

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

感谢您各自的投入。

于 2012-12-11T23:37:07.857 回答
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
于 2012-12-10T23:04:43.477 回答
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>
于 2012-12-12T05:28:16.020 回答