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

请不要使用 awk 进行 XML 解析。这是一个坏主意,因为 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'); 

相关内容