Perl提取XML文件中<field>标签间内容的方法咨询
用Perl提取XML中标签内的内容
作为Perl新手,处理XML时别着急直接上手正则(虽然简单场景能凑活,但复杂XML很容易翻车),这里给你两种靠谱的实现方式,按需选择:
方法一:用正规XML解析模块(推荐,适配所有XML场景)
Perl有专门的XML处理模块,XML::LibXML是最常用的之一,能完美处理XML的嵌套、属性等复杂结构,不会出现正则匹配的各种坑。
步骤:
先安装模块:
用CPAN安装:cpanm XML::LibXML
或者用系统包管理器(比如Ubuntu):sudo apt install libxml-libxml-perl示例代码:
use strict; use warnings; use XML::LibXML; # 解析目标XML文件 my $parser = XML::LibXML->new(); my $doc = $parser->parse_file('your_file.xml') or die "Failed to parse XML: $!"; # 遍历所有<field>节点 foreach my $field ($doc->findnodes('//field')) { # 获取节点内部的XML内容(会包含外层<field>标签,所以需要去掉) my $inner = $field->toString(0); # 0表示压缩格式,去掉多余空格换行 $inner =~ s/^\s*<field>\s*//; # 去掉开头的<field>标签及前后空白 $inner =~ s/\s*<\/field>\s*$//; # 去掉结尾的</field>标签及前后空白 print $inner; } print "\n";
这个方法不管你的
方法二:用正则表达式(仅适合简单无嵌套的XML场景)
如果你的XML结构非常简单,像示例里那样没有嵌套的
use strict; use warnings; # 读取整个XML文件内容 open my $fh, '<', 'your_file.xml' or die "Can't open file: $!"; my $xml_content = do { local $/; <$fh> }; close $fh; # 全局匹配所有<field>...</field>之间的内容(非贪婪匹配) while ($xml_content =~ /<field>(.*?)<\/field>/gs) { print $1; } print "\n";
⚠️ 注意:如果你的XML里存在<field><field>...</field></field>),这个正则会错误地把内层的</field>当成匹配结束,导致提取内容不完整。所以这种场景一定要用方法一的XML解析模块。
另外,看你示例里的结尾标签写的是<field>,应该是笔误成了未闭合的标签,正常XML应该是</field>,如果原文件确实是<field>结尾,把正则里的<\/field>改成<field>即可。
内容的提问来源于stack exchange,提问作者Krishh
相关产品推荐
相关产品推荐

