Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何从外部有效的XML标记中删除垃圾?_Python_Xml_Perl_Sed_Awk - Fatal编程技术网

Python 如何从外部有效的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

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


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

使用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。这看起来很有希望。我明天会在实验室里试一下,然后告诉你怎么做。谢谢,多谢。这看起来很有希望。我明天会在实验室里试一下,然后告诉你怎么做。