2

データ再生ユーティリティから作成された一連のXMLファイルがあります。ユーティリティは、正しく形成されたXMLタグを生成します。残念ながら、ユーティリティは完璧ではありません。シリアル化しようとするJavaオブジェクトの一部は失敗し、これらの他の有効な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>タグはたまたま1本の連続した線上にあります。解決策は、各タグが新しい行にあるように行を分割すること<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 に答える