输入:
<h2>Chapter One</h2>
<h2>Chapter Two</h2>
<h2>Chapter Three</h2>
<h2>Chapter Four</h2>
输出:我需要什么
<h2 id="1">Chapter One</h2>
<h2 id="2">Chapter Two</h2>
<h2 id="3">Chapter Three</h2>
<h2 id="4">Chapter Four</h2>
请对此提供帮助..谢谢
我认为如果您的所有输入 XML 都与您的示例一致,即非常简单,只包含元素,或者您之后只有少数文件需要验证,我认为上面的答案很好。一般来说,将 XML 作为文本处理是一件坏事。从本质上讲,它不是文本。它是高度结构化的。例如,如果编码很重要,会发生变化,例如,您肯定希望将其解析为 XML。
我已经偏爱XML::Twig,因为可以选择流式传输(也可以构建 XML 树),这是一种更接近您在此处看到的命令行编辑的解析样式。我处理大量数据。XML::Twig 实际上非常易于使用,但在实现/配置方面的初始学习曲线可能需要一些研究工作。
有些人更喜欢XML::Lib(设置起来更简单一些),它提供了更多 DOM 风格的风格,但应用于大型数据集的成本更高,而且对于非常大的文件也有点笨拙。从那里开始,各种模块变得不那么复杂,XML::Simple。
同样,这在很大程度上取决于您的要求、数据大小、验证标准等。单线速度很快,但不是处理 XML 的最佳实践。
可能的解决方案
假设 -
您可以使用 XML::Twig 和Lingua::EN::Words2Nums
因此,给定输入:
<root>
<h2>Chapter One</h2>
<h2>Chapter Two</h2>
<h2>Chapter Three</h2>
<h2>Chapter Four</h2>
</root>
这段代码:
use XML::Twig;
use Lingua::EN::Words2Nums;
my $twig = new XML::Twig(
twig_roots => { 'h2' => \&h2_handler },
twig_print_outside_roots => 1);
sub h2_handler {
my ($twig,$elt) = @_;
my $engNum = $elt->trimmed_text;
$engNum =~ s/^chapter\s([a-z]+)$/$1/i;
my $num = words2nums("$engNum");
if (defined($num) and $num=~/\d+/){
$elt->set_att( id => $num);
}else{
# Whatever you do if some chapter number is not what's expected
}
$elt->flush;
}
$twig->parsefile(pathToYourFile);
将输出:
<root>
<h2 id="1">Chapter One</h2>
<h2 id="2">Chapter Two</h2>
<h2 id="3">Chapter Three</h2>
<h2 id="4">Chapter Four</h2>
</root>