当前位置: 首页 > news >正文

perl 用 XML::Parser 解析 XML文件,访问哈希

本篇我们会看到 Perl 成为知名编程语言的关键特色--哈希 hash(2000年以前叫:关联数组)。

在Perl 中,可以使用各种模块和函数来解析 XML元素和属性。其中,最古老的模块是  XML::Parser,它提供了一组完整的XML解析和处理函数,可以解析XML文档中的元素和属性。

例如,下面是一个使用 XML::Parser 模块解析 XML元素和属性 的示例代码:

编写 xml_parser_tree.pl  如下

#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use utf8;
use XML::Parser;
use Data::Dumper;if ($#ARGV != 0){die "You must specify a file.xml to parse";
}
my $file = shift @ARGV;
# Tree 风格比较难用,它的数据结构不符合标准的JSON.
my $p = XML::Parser->new(Style => 'Tree',Handlers => {Start => \&start, End => \&end_, Char => \&text});
my $tree = $p->parsefile($file) or die "cannot read file.xml\n";
#print Dumper($tree);my $f2 = $file .'.txt';
# 写入文件
open(my $fw, '>:encoding(UTF-8)', $f2) or die "cannot open file '$f2' $!";
my @array;
# 访问 hash
sub start { my ($self, $tag, %attribs) = @_;if ($tag eq 'node'){push @array, $attribs{'TEXT'};}
}
sub end_ {my ($self, $tag) = @_;
}
sub text {my ($self, $text) = @_;
}
my $ln =0; # 行数
foreach my $txt (@array){print $fw $txt ."\n";$ln++;
}
close($fw);
print $ln;

运行 perl xml_parser_tree.pl your_test.xml

编写  xml_parser_subs.pl  如下

#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use utf8;
use XML::Parser;
#use Data::Dumper;if ($#ARGV != 0){die "You must specify a file.xml to parse";
}
my $file = shift @ARGV;
# Subs 风格比较容易使用,它需要对应于标签名定义子程序
my $p = XML::Parser->new(Style => 'Subs',Handlers => {Char => \&text});
my $doc = $p->parsefile($file) or die "cannot read file.xml\n";
say '$doc is a ', $doc;my $f2 = $file .'.txt';
# 写入文件
open(my $fw, '>:encoding(UTF-8)', $f2) or die "cannot open file '$f2' $!";
my @array;
# 访问 hash
sub node { my ($self, $tag, %attribs) = @_;push @array, $attribs{'TEXT'};
}
sub node_ {my ($self, $tag) = @_;
}
sub text {my ($self, $text) = @_;
}
my $ln =0; # 行数
foreach my $txt (@array){print $fw $txt ."\n";$ln++;
}
close($fw);
print $ln;

运行 perl xml_parser_subs.pl your_test.mm

参阅:XML::Parser - A perl module for parsing XML documents - metacpan.org

相关文章:

  • [ C++ ] STL---stack与queue
  • 分库分表场景下多维查询解决方案(用户+商户)
  • 数字人解决方案— SadTalker语音驱动图像生成视频原理与源码部署
  • MySQL连接详解(内外连接,左右连接)
  • 全球首位AI程序员诞生,会抢走程序员的饭碗吗?
  • C# 读取指定文件夹
  • 【PMP】每日一练2
  • 前端项目构建过程中涉及低代码部分思考
  • 2024年3月22蚂蚁新村今日答案:以下哪一项是陕西省的非遗美食?
  • 大数据-基础架构设施演进的过程
  • Android学习进阶
  • Mapper.xml映射文件
  • 【笔记】Python学习记录
  • Windows 11 安装 Scoop
  • Mysql数据库:索引管理
  • [笔记] php常见简单功能及函数
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • CSS相对定位
  • JDK 6和JDK 7中的substring()方法
  • MySQL-事务管理(基础)
  • SOFAMosn配置模型
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 使用docker-compose进行多节点部署
  • 【运维趟坑回忆录 开篇】初入初创, 一脸懵
  • Salesforce和SAP Netweaver里数据库表的元数据设计
  • 关于Kubernetes Dashboard漏洞CVE-2018-18264的修复公告
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • $.type 怎么精确判断对象类型的 --(源码学习2)
  • $L^p$ 调和函数恒为零
  • ( 用例图)定义了系统的功能需求,它是从系统的外部看系统功能,并不描述系统内部对功能的具体实现
  • (1)Android开发优化---------UI优化
  • (4)STL算法之比较
  • (4)事件处理——(7)简单事件(Simple events)
  • (6)STL算法之转换
  • (day6) 319. 灯泡开关
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (附源码)spring boot火车票售卖系统 毕业设计 211004
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (免费领源码)Python#MySQL图书馆管理系统071718-计算机毕业设计项目选题推荐
  • (七)理解angular中的module和injector,即依赖注入
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (转)大型网站架构演变和知识体系
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET MVC、 WebAPI、 WebService【ws】、NVVM、WCF、Remoting
  • .net2005怎么读string形的xml,不是xml文件。
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • [ CTF ] WriteUp- 2022年第三届“网鼎杯”网络安全大赛(朱雀组)
  • [ IO.File ] FileSystemWatcher
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [ 隧道技术 ] 反弹shell的集中常见方式(四)python反弹shell
  • [.net] 如何在mail的加入正文显示图片
  • [ACL2022] Text Smoothing: 一种在文本分类任务上的数据增强方法
  • [C++基础]-初识模板