由于记录分隔符 (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');