Python 如何从外部有效的XML标记中删除垃圾?
我有一系列由数据回放实用程序生成的XML文件。该实用程序生成格式正确的XML标记。不幸的是,这个实用程序并不完美。它试图序列化的一些Java对象失败了,它们只是作为二进制blob插入到这些其他有效的XML标记之间 例如Python 如何从外部有效的XML标记中删除垃圾?,python,xml,perl,sed,awk,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,这意味着可以使用Pytho
<track>
<cto>Valid_XML_HERE</cto>@Binary_Blob_of_Junk@<cto>(...)</cto>
</track>
环境是RHEL-5,这意味着可以使用Python 2.4、Perl或SED/AWK解决方案
关于如何删除垃圾的任何建议?使用XML::Twig解析器删除跟踪标记文本的其他方法: 将文件作为第一个唯一参数运行:
perl script.pl xmlfile
使用XML::Twig解析器删除跟踪标记文本的其他方法: 将文件作为第一个唯一参数运行:
perl script.pl xmlfile
我借鉴了Birei关于检查树元素的建议,但提出了一个SED唯一的解决方案。如OP所示,标签恰好位于一条连续线上。然后,解决方案是拆分行,使每个标记位于新行上——因此,也隔离新行上的垃圾二进制数据——然后简单地选择以标记开头的行 可以通过CAT将and标记简单地添加到新文件中 下面是我已经测试过的SED命令,并确认它们可以正常工作 第一步。隔离要在新行上的标记
sed -i "s/<cto/\n<cto/g;s/<\/cto>/<\/cto>\n/g" ${FILE}
感谢各位的投入。我借鉴了Birei的建议来检查树元素,但提出了一个只有SED的解决方案。如OP所示,标签恰好位于一条连续线上。然后,解决方案是拆分行,使每个标记位于新行上——因此,也隔离新行上的垃圾二进制数据——然后简单地选择以标记开头的行 可以通过CAT将and标记简单地添加到新文件中 下面是我已经测试过的SED命令,并确认它们可以正常工作 第一步。隔离要在新行上的标记
sed -i "s/<cto/\n<cto/g;s/<\/cto>/<\/cto>\n/g" ${FILE}
感谢您的所有投入。这里有一个快速的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>
这里有一个快速的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>
您可以使用正则表达式,尤其是python库中re的re.sub。答案可以在类似的问题中找到:取决于垃圾到底是什么样子。垃圾就是那个,二进制数据。除了java的作用之外,没有明显的模式。正如所建议的,我目前正在寻求一种使用Python的“re”模块的解决方案,但到目前为止,我只成功地隔离了单个标记,这解决了从文件的顶部/底部修剪二进制垃圾的第一个问题。我现在正在尝试从这些标记中的有效标记之间删除垃圾。问题是有些标记是单行的,没有组件。您可以使用正则表达式,尤其是python库中re的re.sub。答案可以在类似的问题中找到:取决于垃圾到底是什么样子。垃圾就是那个,二进制数据。除了java的作用之外,没有明显的模式。正如所建议的,我目前正在寻求一种使用Python的“re”模块的解决方案,但到目前为止,我只成功地隔离了单个标记,这解决了从文件的顶部/底部修剪二进制垃圾的第一个问题。我现在正在尝试从这些标记中的有效标记之间删除垃圾。问题是有些标签是单行的,没有组件。我认为要求删除一个轨迹元素的所有文本子元素。这只会抹去轨迹及其所有信息。@Borodin:你说得对。非常感谢。我将在一段时间内尝试修复它。事实证明,我无法在这个工作站上访问XML::Twig,该工作站大约在2006年安装了最低限度的perl-5.8.8。我认为要求删除track元素的所有文本子元素。这只会抹去轨迹及其所有信息。@Borodin:你说得对。非常感谢。我将在一段时间内尝试修复它。事实证明,我无法访问此工作站上的XML::Twig,该工作站大约在2006年安装了最低限度的perl-5.8.8。谢谢,ddoxey。这看起来很有希望。我明天会在实验室里试一下,然后告诉你怎么做。谢谢,多谢。这看起来很有希望。我明天会在实验室里试一下,然后告诉你怎么做。