从XML标记中删除空白
我试图编写一个perl脚本,从XML标记中删除空白,但在值中保留空白。例如,假设我有:从XML标记中删除空白,xml,regex,perl,whitespace,xml-parsing,Xml,Regex,Perl,Whitespace,Xml Parsing,我试图编写一个perl脚本,从XML标记中删除空白,但在值中保留空白。例如,假设我有: <Example>This is an example.</Exampl e> 这是一个例子。 我希望完成的是在中删除空白。由于这将对整个XML文档起作用,我想我应该使用替换操作符,但我不太明白如何只匹配XML标记本身内部的空白 非常感谢您的帮助 编辑:我添加了一个真实的例子来说明发生了什么: not well-formed (invalid token) at line 42
<Example>This is an example.</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>
第42行第25列字节1456的格式不正确(无效标记):
阿姆
阿姆·费特·利尔·韦恩-没有爱-
hotnewhiphop com(2).mp3
========================^
4804478
我强烈建议您避免使用自己的XML解析,或尝试通过正则表达式等操作XML
使用众多可用的XML解析器中的一个,省去了麻烦
例如,看看
另请参阅,以获取有关使用Perl处理XML的相当全面的常见问题解答。s!()!$1$2!G
s!(</?\w+)\s+(\w+\s+/?>)!$1$2!g;
如果您想在带有属性的标记中实际保留空格,则会变得更复杂,因为空格是标记中的合法字符。你几乎必须找到后面没有等号或空格+等号的“单词”,并将它们与前面的-未引用的-单词相结合
子婚姻内部分割{
我的美元=班次;
#修复损坏的标签
s^/?(\w+)\s+(\w+)\b(?!\s*=)|$1$2 |;
#找到结果位置。
我的$pos=索引($);
#如果没有空格,则返回。
如果$pos==-1,则返回$;
#将其余文本绑定到子字符串
substr($389;,$pos)=~s/(\s*\w+)\s+(\w+\s*=\s*(?:“[^”]+“|”[^']+')\s*)/$1$2/g;
返回$\;
}
我的$tag_str=q{标记前的一些东西};
$tag_str=~s/]+)>/''/ge;
e
标志意味着您正在替换零件中*eval
*-ing。基于此示例,XML可能格式不正确。是否正确?(这对所需的方法产生了很大的影响。)正确,在我解码包含xml数据的带引号的打印消息后会出现问题。但是,基于所使用的架构,标记本身不应该有任何空格。您是如何进行解码的?您是手动执行还是使用CPAN的MIME工具(即,MIME::Decoder
)?--一开始最好避免损坏,而不是事后修补。我使用MIME::QuotedPrint::Perl的解码来处理文件,它会将文件清理干净(否则在某些行的末尾会看到=20)。如果我能告诉RIAA清理他们的XML,那就太好了,但我怀疑他们是否会合作。如果XML格式不好,就拒绝它,而不是试图用令人讨厌的方式咀嚼它,因为这样容易造成脆弱性和意外破坏。这是我一直遇到的问题。我正在尝试解析来自各种来源的DMCA通知(似乎喜欢使用引用的打印消息,这会弄乱XML本身)每次我尝试解析收到的某些XML文档时,我都会收到由格式不正确的XML标记引起的无效标记,我正在尝试修复这些标记。这些模块中是否有任何模块可以修复该问题或智能地解释空白?您可以试着通过例如xmllint运行XML,看看它的作用。一般来说,我宁愿站在如果它不是有效的XML,那么拒绝它”的方法。@Timothy,听起来好像你在说你没有正确处理传输(或类似的)编码。也许这就是我们应该关注的问题?本质上,我必须使用MIME::QuotedPrint::Perl从包含XML的邮件消息中去除quoted print,这通常是有效的,除了一些电子邮件看起来像是对文本进行了换行,并跨行拆分了一些标记或添加了空格。有布尔属性s(不带值),例如
Qtax,则它不是XML。在XML中,所有属性都必须有带引号的值。
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;