perl 用 XML::DOM 解析 Freeplane.mm文件,生成测试用例.csv文件

Perl 官网 www.cpan.org
从 https://strawberryperl.com/  下载网速太慢了
建议从 https://download.csdn.net/download/qq_36286161/87892419
下载 strawberry-perl-5.32.1.1-64bit.zip  约105MB
解压后安装.msi,装完后有520MB+,建议安装在D:盘。

运行 cmd
cpan
install XML::DOM

在云计算中,解析XML元素和属性是一种常见的操作,因为XML是一种常见的数据交换格式,可以用来表示各种不同的数据结构和信息。Perl 是一种过去流行的脚本语言,可以用来处理各种文本数据,包括XML数据。

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

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

先编写一个测试程序 test_xml_dom.pl  如下

#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use utf8;
use XML::DOM;
use Data::Dumper;if ($#ARGV != 0){die "You must specify a file.xml to parse";
}
my $file = shift @ARGV;my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile($file)or die "cannot read file.xml\n";my $f2 = $file .'.txt';
# 写入文件
open(my $fw, '>:encoding(UTF-8)', $f2) or die "cannot open file '$f2' $!";# print all TEXT attributes of all node elements
my $nodes = $doc->getElementsByTagName('node');
my $n = $nodes->getLength;for (my $i=0; $i < $n; $i++)
{my $node = $nodes->item ($i);my $TEXT = $node->getAttributeNode('TEXT');print $fw $TEXT->getValue ."\n";
}
close($fw);
# Avoid memory leaks - for garbage collection
$doc->dispose;

运行  perl test_xml_dom.pl your_test.xml 

再编写  xml_dom_parser.pl  如下

#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use utf8;
use XML::DOM;# 解析 Freeplane.mm文件,生成测试用例.csv文件
#  xt: 应用系统名的英文或拼音缩写
# zd?: 字段?的拼音缩写
# zd1: 模块名
# zd2: 功能名
# zd3: 正向 或 反向
# zd4: 测试要点
# zd5: 执行步骤
# zd6: 预期结果
# csylms:测试用例描述if ($#ARGV != 0){die "You must specify a file.xml to parse";
}
my $file = shift @ARGV;my $parser = new XML::DOM::Parser;
my $doc = $parser->parsefile($file)or die "cannot read file.xml\n";my $f2 = $file .'.csv';
# 写入文件
open(my $fw, '>:encoding(UTF-8)', $f2) or die "cannot open file '$f2' $!";
print $fw "应用系统名,模块名,测试用例描述,正反向,执行步骤,预期结果\n";# 要检查一个字符串是否以另一个字符串开始,可使用字符串比较:
sub startsWith {  my ($str, $prefix) = @_;  return substr($str,0, length($prefix)) eq $prefix;
} # 获取根节点  
my $root = $doc->getFirstChild;
my $nodes = $root->getElementsByTagName('node');
my $node = $nodes->item(0);
say ref($node);
my $xt = $node->getAttributeNode('TEXT')->getValue;
my ($zd1,$zd2,$zd3,$zd4,$zd5,$zd6,$txt,$csylms);
$zd5 =''; $zd6 ='';
foreach my $node1 ($node->getChildNodes){
if($node1->getNodeType == ELEMENT_NODE and $node1->getTagName eq 'node'){my $t1 = $node1->getAttributeNode('TEXT');if ($t1){ $zd1 = $t1->getValue;}foreach my $node2 ($node1->getChildNodes){if($node2->getNodeType == ELEMENT_NODE and $node2->getTagName eq 'node'){my $t2 = $node2->getAttributeNode('TEXT');if ($t2){ $zd2 = $t2->getValue;}foreach my $node3 ($node2->getChildNodes){if($node3->getNodeType == ELEMENT_NODE and $node3->getTagName eq 'node'){my $t3 = $node3->getAttributeNode('TEXT');if ($t3){ $zd3 = $t3->getValue;}foreach my $node4 ($node3->getChildNodes){if($node4->getNodeType == ELEMENT_NODE and $node4->getTagName eq 'node'){my $t4 = $node4->getAttributeNode('TEXT');if ($t4){ $zd4 = $t4->getValue;}foreach my $node5 ($node4->getChildNodes){if($node5->getNodeType == ELEMENT_NODE and $node5->getTagName eq 'node'){my $t5 = $node5->getAttributeNode('TEXT');if ($t5){ $txt = $t5->getValue;if (startsWith($txt, '步骤:')){$zd5 = substr($txt, 3);} elsif (startsWith($txt, '预期结果:')){$zd6 = substr($txt, 5);$csylms = $zd2 .'-'. $zd4; # 测试用例描述print $fw "$xt,$zd1,$csylms,$zd3,$zd5,$zd6\n";} else {$zd5 =''; $zd6 ='';}}}}}}}}}}
}}
close($fw);
# Avoid memory leaks - for garbage collection
$doc->dispose;

运行 perl xml_dom_parser.pl your_test.mm

应用系统名,模块名,测试用例描述,正反向,执行步骤,预期结果
应用系统,模块1,功能11-测试要点111,正向,1.步骤,1.结果
应用系统,模块1,功能11-测试要点112,正向,2.步骤,2.结果
应用系统,模块1,功能11-要点111,反向,3.步骤,3.结果
应用系统,模块1,功能11-要点112,反向,4.步骤,4.结果
应用系统,模块2,功能21-测试要点211,正向,5.步骤,5.结果
应用系统,模块2,功能21-测试要点212,正向,6.步骤,6.结果
应用系统,模块2,功能21-要点211,反向,7.步骤,7.结果
应用系统,模块2,功能21-要点212,反向,8.步骤,8.结果

参阅:XML::DOM - A perl module for building DOM Level 1 compliant document structures - metacpan.org

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2869646.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL--深入理解MVCC机制原理

什么是MVCC&#xff1f; MVCC全称 Multi-Version Concurrency Control&#xff0c;即多版本并发控制&#xff0c;维持一个数据的多个版本&#xff0c;主要是为了提升数据库的并发访问性能&#xff0c;用更高性能的方式去处理数据库读写冲突问题&#xff0c;实现无锁并发。 什…

Visual Studio项目模板的创建与使用

Visual Studio项目模板的创建、使用、删除 创建模板项目模板的使用模板的删除 创建模板 点击项目&#xff0c;点击导出模板 选择你要创建哪个项目的项目模板&#xff0c;点击下一步 输入你的模板名称并添加模板说明&#xff0c;方便记忆 项目模板的使用 点击创建新项目 输入刚刚…

JSP+Servlet开发汽车租赁管理系统

开发工具&#xff1a;EclipseJdkTomcatSQLServer数据库 链接: https://pan.baidu.com/s/1O5tGguNl6V1CvSpN-amNXA 提取码: exak 如果需要&#xff0c;联系下面的客服人员

免费开源多层级多标签文本分类|文本分类接口|文本自动分类

一、开源项目介绍 一款多模态AI能力引擎&#xff0c;专注于提供自然语言处理&#xff08;NLP&#xff09;、情感分析、实体识别、图像识别与分类、OCR识别和语音识别等接口服务。该平台功能强大&#xff0c;支持本地化部署&#xff0c;并鼓励用户体验和开发者共同完善&#xf…

tomcat 实现会话绑定

Tomcat 后端服务器实现 Session ID会话保持 基础架构&#xff1a; 7-6 代理服务器nginx配置 7-3 tomcat 服务器 7-5 同理 测试&#xff1a; 此时刷新&#xff0c;会话ID一直在变&#xff0c;这样不好 如何解决呢&#xff1f; 不好的是确定ip之后&#xff0c;会一直在一台机上…

IntelliJ IDEA 面试题及答案整理,最新面试题

IntelliJ IDEA中的插件系统如何工作&#xff1f; IntelliJ IDEA的插件系统工作原理如下&#xff1a; 1、插件架构&#xff1a; IntelliJ IDEA通过插件架构扩展其功能&#xff0c;插件可以添加新的功能或修改现有功能。 2、安装和管理&#xff1a; 通过IDEA内置的插件市场下载…

【数据结构和算法初阶(C语言)】二叉树铺垫--栈帧的创建与销毁--细节全解

前言&#xff1a; 学习这么久以来&#xff0c;可能有很多疑问&#xff1a;局部变量怎么创建的&#xff1f;为什么局部变量的值是随机的&#xff1f;函数是怎么传参的&#xff1f;传参的顺序是怎么样的&#xff1f;形参和实参是什么样的关系&#xff1f;函数调用是怎么做的&…

HCIP—BGP邻居关系建立实验

BGP的邻居称为&#xff1a;IBGP对等体 EBGP对等体 1.EBGP对等体关系&#xff1a; 位于 不同自治系统 的BGP路由器之间的BGP对等体关系 EBGP对等体一般使用 直连建立 对等体关系&#xff0c;EBGP邻居之间的报文 TTL中值设置为1 两台路由器之间建立EBGP对等体关系&#xff0…

章鱼网络 Community Call #19|​开启与 Eigenlayer 的合作

香港时间2024年3月8日12点&#xff0c;章鱼网络举行第19期 Community Call。 在过去的一个月&#xff0c;章鱼网络在成功完成 $NEAR Restaking 功能的安全审计之后&#xff0c;一直在稳步吸引关注。事实上&#xff0c;在整个行业中&#xff0c;我们是极少数已经推出 Restaking …

数据结构 之 二叉树

&#x1f389;欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ &#x1f389;感谢各位读者在百忙之中抽出时间来垂阅我的文章&#xff0c;我会尽我所能向的大家分享我的知识和经验&#x1f4d6; &#x1f389;希望我们在一篇篇的文章中能够共同进步&#xff01;&#xff01;&…

【机器学习-02】矩阵基础运算---numpy操作

在机器学习-01中&#xff0c;我们介绍了关于机器学习的一般建模流程&#xff0c;并且在基本没有数学公式和代码的情况下&#xff0c;简单介绍了关于线性回归的一般实现形式。不过这只是在初学阶段、为了不增加基础概念理解难度所采取的方法&#xff0c;但所有的技术最终都是为了…

Mysql:行锁,间隙锁,next-key锁?

注&#xff1a;以下讨论基于InnoDB引擎。 文章目录 问题引入猜想1&#xff1a;只加了一行写锁&#xff0c;锁住要修改的这一行。语义问题数据一致性问题 猜想2&#xff1a;要修改的这一行加写锁&#xff0c;扫描过程中遇到其它行加读锁猜想3&#xff1a;要修改的这一行加写锁&…

BigDecimal保留两位小数失败问题

文章目录 背景问题解决如何测试代码 背景 测试时发现在线swagger测试会自动处理BigDecimal小数点后面的数字&#xff0c;就是有零的会都给你去掉&#xff0c;比如9.000与9.500到最后都会被swagger处理成9跟9.5。使用postman测是最准的&#xff0c;测出来的就是9.000跟9.500。 …

react可视化编辑器 第一章 拖拽

效果&#xff1a; 实现可视化编辑器&#xff0c;第一步难点 是 拖拽 提示&#xff1a;链接和图片默认是可拖动的&#xff0c;不需要draggable属性。 在拖放操作的不同阶段使用并可能发生许多事件属性&#xff1a; 在可拖动目标上触发的事件&#xff08;源元素&#xff09;&a…

【渗透测试】redis漏洞利用

redis安装及配置 wget http://download.redis.io/releases/redis-3.2.0.tar.gz tar xzf redis-3.2.0.tar.gz cd redis-3.2.0 make cp /root/redis-6.2.6/redis.conf /usr/local/redis/bin/ cd /usr/local/redis/bin/ vi redis.conf #修改内容如下&#xff1a; #protected-mode …

数据结构的概念大合集04(队列)

概念大合集04 1、队列1.1 队列的定义1.2队列的顺序存储1.2.1 顺序队1.2.2 顺序队的基本运算的基本思想1.2.3 顺序队的4要素的基本思想 1.3 环形队列1.3.1 环形队列的定义1.3.1 环形队列的实现 1.4 队列的链式存储1.4.1 链队1.4.2 链队的实现方式1.4.3 链队的4要素的基本思想 1.…

开发环境热部署:2021版IDEA没有compiler.automake.allow.when.app.running

解决办法&#xff1a;Settings--> Advanced Settings -->Compiler勾选上

科研学习|论文解读——了解在线环境中的多数观点形成过程:Facebook的探索性方法(IPM, 2018)

论文标题 Understanding the majority opinion formation process in online environments: An exploratory approach to Facebook 摘要 在在线社区的社会互动过程中&#xff0c;多数观点经常被观察到&#xff0c;但很少有研究用实证数据来解决这一问题。为了确定一个合适的理论…

Ubuntu 虚拟机安装

最小化安装后常用工具 sudo apt-get install vim# ifconfig apt install net-tools # nload apt install nload # 很多都要用到 apt install build-essential # 开发相关 apt install gcc gapt install iproute2 ntpdate tcpdump telnet traceroute \ nfs-kernel-server nfs…

刚刚离乳的幼猫该如何选择猫粮品牌?

亲爱的猫友们&#xff0c;当你家的幼猫刚刚离乳&#xff0c;准备踏入猫粮的世界时&#xff0c;如何选择一款合适的猫粮品牌确实是个让人头疼的问题。&#x1f43e; 别担心&#xff0c;今天我就来为大家推荐一款值得信赖的幼猫粮——福派斯幼猫粮。 1️⃣ 考虑幼猫的营养需求 幼…