我有一系列由数据回放实用程序生成的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解决方案。
对如何删除垃圾有什么建议吗?
发布于 2012-12-12 07:37:08
我基于Birei的建议来检查树元素,但是想出了一个仅适用于SED的解决方案。如操作中所示,<cto>标记恰好在一个连续的行上。然后,解决方案是拆分行,使得每个<cto>标记都在一个新的行上--因此,也将垃圾二进制数据隔离在新的行上--然后简单地选择以<cto>标记开始的行。
可以通过CAT将<tracks>和</tracks>标记简单地添加到新文件中。
以下是我测试过并确认有效的SED命令。
步骤1.隔离要在新行上的<cto>标记。
sed -i "s/<cto/\n<cto/g;s/<\/cto>/<\/cto>\n/g" ${FILE}步骤2.只选择以<cto>标记开头的行。
sed -i "/<cto/p" ${FILE}步骤3.格式化新的XML文档。
xmllint --format "${FILE}" > foo.xml感谢你们各自的投入。
发布于 2012-12-11 07:04:43
使用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;使用您的文件作为第一个(也是唯一的)参数运行它:
perl script.pl xmlfile发布于 2012-12-12 13:28:16
下面是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>https://stackoverflow.com/questions/13810318
复制相似问题