我正在尝试编写一个从XML标记中删除空格的perl脚本,但在值内留下空格。例如,假设我有:
<Example>This is an example.</Exampl e>
我想要完成的是在</Exampl e>
中专门敲掉空白。由于这将处理整个XML文档,我想我会用替换运算符做一些事情,但我无法弄清楚如何只匹配可能在XML标记本身内部的空格。
非常感谢任何帮助!
编辑:我添加了一个正在发生的事情的真实示例:
not well-formed (invalid token) at line 42, column 25, byte 1456:
<Artist>Eminem</Artist>
<FileName>eminem feat lil wayne - no love -
hotnewhiphop com(2).mp3</ FileName>
========================^
<FileSize>4804478</FileSize>
答案 0 :(得分:3)
s!(</?\w+)\s+(\w+\s+/?>)!$1$2!g;
如果要在带有属性的标记中实际留下空格,则会变得更复杂,因为空格是标记中的合法字符。你几乎必须在他们之后找到没有等于或空格+等于的“单词”并将它们与之前的未加引号的 - 单词结合起来。
sub marry_inner_splits {
my $_ = shift;
# fix broken tags
s|^/?(\w+)\s+(\w+)\b(?!\s*=)|$1$2|;
# find the resulting position.
my $pos = index( $_, ' ' );
# return if there is no whitespace.
return $_ if $pos == -1;
# bind the rest of the text to the substring
substr( $_, $pos ) =~ s/(\s*\w+)\s+(\w+\s*=\s*(?:"[^"]+"|'[^']+')\s*)/$1$2/g;
return $_;
}
my $tag_str = q{Some stuff before the tag <ta g attr1="val1" att r2="value #2" /></Escap e>};
$tag_str =~ s/<([^>]+)>/'<' . marry_inner_splits($1) . '>'/ge;
e
标志表示您在替换部分中* eval
*。
答案 1 :(得分:1)
我强烈建议避免滚动自己的XML解析,或尝试通过正则表达式等操作XML。
使用众多可用的XML解析器之一,让自己免于麻烦。
例如,请查看XML::Easy,XML::Smart,XML::TreeBuilder,XML::Twig。
另请参阅http://perl-xml.sourceforge.net/faq/,了解有关使用Perl处理XML的非常全面的常见问题解答。