XML awk形式の問題

XML awk形式の問題

レコード区切り文字(RS = "\ n \ n")のため、出力XML形式に問題があります。データセットは空行で区切られます。どんな提案でも望ましい結果を得るのに非常に役立ちます。

これはinput.txtの私の入力です。

Alex
Marks300
SubjectScience

Robin
Marks200
SubjectChemistry

次のような出力を取得しようとしています。

<candidate>
<name>Alex</name>
<marks>Marks300</marks>
<subject>SubjectScience</subject>
</candidate>

<candidate>
<name>Robin</name>
<marks>Marks200</marks>
<subject>SubjectChemistry</subject>
</candidate>

次のコードを使用しようとしても機能しません。

awk 'BEGIN{FS = "\\n";RS = "\\n\\n";
print " "}
{ print "<candidate>" }
{ print "<name>"$1"</name>" }
{ print "<marks>"$2"</marks>" }
{ print "<subject>"$3"</subject>" }
{ print "</candidate>" }
{print " " }' input.txt > candiatefinaloutput.xml

上記のコードを使用すると、次のような結果が得られます。

<candidate>
<name>alex<\name>
<marks><\marks>
<subject><\subject>

<name>Marks300<\name>
<marks><\marks>
<subject><\subject>

<name>SubjectScience<\name>
<marks><\marks>
<subject><\subject>

<name>Robin<\name>
<marks><\marks>
<subject><\subject>

など。

答え1

次のことを試してみてください。

awk 'BEGIN{FS = "\n";RS = "\n\n";
print " "}
{ print "<candidate>" }
{ print "<name>"$1"</name>" }
{ print "<marks>"$2"</marks>" }
{ print "<subject>"$3"</subject>" }
{ print "</candidate>" }
{print " " }' input.txt > candiatefinaloutput.xml

これが私が得るものです:

[romeo.romeo-PC] ➤ cat 3
Alex
Marks300
SubjectScience

Robin
Marks200
SubjectChemistry
────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
[2015-05-07 09:00.04]  ~/tmp
[romeo.romeo-PC] ➤ awk 'BEGIN{FS = "\n";RS = "\n\n";
print " "}
{ print "<candidate>" }
{ print "<name>"$1"</name>" }
{ print "<marks>"$2"</marks>" }
{ print "<subject>"$3"</subject>" }
{ print "</candidate>" }
{print " " }' 3

<candidate>
<name>Alex</name>
<marks>Marks300</marks>
<subject>SubjectScience</subject>
</candidate>

<candidate>
<name>Robin</name>
<marks>Marks200</marks>
<subject>SubjectChemistry </subject>
</candidate>

答え2

awkの閉じた一重引用符を見逃していないことを願っています。タイプミスだったことを願っています!また、多くの個々の印刷コマンドの代わりに「\ n」だけを印刷できることに注意してください(セミコロンを使用して区切る場合もあります)。

答え3

XML解析にawkを使用しないでください。 XMLは改行、インデント、属性改行、単項タグなどの機能をサポートしているため、これは悪い考えです。これは、すべて行/フィールド/正規表現指向のアプローチを使用すると、意味的に同じXMLが中断されることを意味します。

したがって、XMLツールを使用してXMLを作成することをお勧めします。たとえば、次のようになります。

use strict;
use warnings;
use XML::Twig;

my $twig = XML::Twig->new( 'pretty_print' => 'indented_a' );
$twig->set_root( XML::Twig::Elt->new('root') );

open( my $input, "<", "input.txt" ) or die $!;

local $/ = "\n\n";

while (<$input>) {
    my ( $name, $marks, $subject ) = (m/(\w+)\nMarks(\d+)\nSubject(\w+)/s);
    my $candidate = $twig->root->insert_new_elt( 'last_child', 'candidate' );
    $candidate->insert_new_elt( 'last_child', 'name',    $name );
    $candidate->insert_new_elt( 'last_child', 'marks',   $marks );
    $candidate->insert_new_elt( 'last_child', 'subject', $subject );
}
close($input);
$twig->print;

これにより、コンテンツ表示に最適な形式で出力形式を自由に指定することができる。 「正しい」有効なXMLを生成するには、次のものを含める必要があります。

$twig -> set_xml_version('1.0');
$twig -> set_encoding('utf-8'); 

関連情報