我正在做一个perl脚本,它会对xml文件进行一些格式化。在打开任何xml标签之前,我需要一些帮助来忽略空格。我有以下xml文件
的test.xml
<xml>
<TI>Definitions, Exemptions and Rebates "where"
<VARPARA><VAR>E</VAR></VARPARA></TI>
</xml>
我想要一个正则表达式,它将在打开任何带有单个空格的xml标记之前替换任何空格,包括额外的空格和换行符,因此在上面的例子中<VARPARA>
是带有一些空格的标记和#34;之后的新行字符&#34;。
我正在思考
的内容$s =~ s/\s*</ </ig;
但是在这里它只会查看开始标记<
,而我想检查开始<
和结束标记>
以及
<VARPARA>
。
输出字符串应如下所示
<xml>
<TI>Definitions, Exemptions and Rebates "where" <VARPARA><VAR>E</VAR></VARPARA></TI>
</xml>
答案 0 :(得分:2)
要确定<
是否是标记的开头,您必须查明它是否在评论中,在CDATA部分中等等。您需要的不仅仅是正则表达式。我建议使用现有的解析器。
use XML::LibXML qw( );
my $parser = XML::LibXML->new();
my $doc = $parser->parse_file($qfn);
for my $text_node ($doc->findnodes('//text()')) {
my $text = $text_node->data();
next if $text =~ /^\s+\z/;
my $next_node = $text_node->nextSibling();
next if !$next_node;
$text =~ s/\s+\z/ /;
$text_node->setData($text);
}
$doc->toFile($qfn);
答案 1 :(得分:1)
我不是正则表达式专家,所以在某些情况下这可能会失败,但根据您的上一条评论,请尝试下一步:
echo '<xml>
<TI>Definitions, Exemptions and Rebates "where"
<VARPARA><VAR>E</VAR></VARPARA></TI>
<TI>Definitions, Exemptions and Rebates "where"
<VARPARA><VAR>E</VAR></VARPARA></TI>
</xml>' | perl -0777 -pE 's/(\S)(\s+)(<\w+?>)/$1 $3/g;s/> +</>\n</g'
<xml>
<TI>Definitions, Exemptions and Rebates "where" <VARPARA><VAR>E</VAR></VARPARA></TI>
<TI>Definitions, Exemptions and Rebates "where" <VARPARA><VAR>E</VAR></VARPARA></TI>
</xml>
答案 2 :(得分:0)
这就是我处理它的方式。
$ s = ~s / \ s +(?= \&lt; \ w +&gt;)/ / xig;