我有一系列从数据回放实用程序生成的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解决方案。
有关如何移除垃圾的任何建议吗?
答案 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>