Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。
在云计算中,解析XML元素和属性是一种常见的操作,因为XML是一种常见的数据交换格式,可以用来表示各种不同的数据结构和信息。Perl 是一种过去流行的脚本语言,可以用来处理各种文本数据,包括XML数据。
在Perl 中,可以使用各种模块和函数来解析 XML元素和属性。其中,最常用的模块是 XML::LibXML,它提供了一组完整的XML解析和处理函数,可以非常方便地解析XML文档中的元素和属性。
例如,下面是一个使用 XML::LibXML 模块 DOM方式 解析 XML元素和属性 的示例代码:
编写 test_LibXML_dom.pl 如下
#!/usr/bin/perl
use 5.010;
use strict;
use warnings;
use utf8;
use XML::LibXML;# 解析 Freeplane.mm文件,生成测试用例.csv文件
# xt: 应用系统名的英文或拼音缩写
# testno: 测试用例编号
# zd?: 字段?的拼音缩写
# zd1: 模块名
# zd2: 功能名
# zd3: 正向 或 反向
# zd4: 测试要点
# zd5: 执行步骤
# zd6: 预期结果
# csylms:测试用例描述if ($#ARGV != 0){die "You must specify a file.xml to parse";
}
my $file = shift @ARGV;# 创建一个XML解析器对象
my $p = XML::LibXML->new();# 解析XML文档
my $dom = $p->load_xml(location => $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 = $dom->documentElement;
my($node) = $root->getChildrenByTagName('node');
say '$node is a ', ref($node);#获取某个节点的TEXT属性和属性值
sub getAttribute {my($node) = @_;my @attrs = $node->attributes();my $txt ='';foreach my $attr (@attrs) {if( $attr->nodeName() eq 'TEXT'){$txt = $attr->value();$txt =~s/\s+$//;} }return $txt;
}
my $xt = getAttribute($node);
#print $xt;
my ($zd1,$zd2,$zd3,$zd4,$zd5,$zd6,$txt,$csylms);
$zd5 =''; $zd6 ='';
#my @childs = $node->childNodes;
foreach my $node1 ($node->childNodes){if( $node1->nodeName() eq 'node'){$zd1 = getAttribute($node1);foreach my $node2 ($node1->childNodes){if( $node2->nodeName() eq 'node'){$zd2 = getAttribute($node2);foreach my $node3 ($node2->childNodes){if( $node3->nodeName() eq 'node'){$zd3 = getAttribute($node3);foreach my $node4 ($node3->childNodes){if( $node4->nodeName() eq 'node'){$zd4 = getAttribute($node4);foreach my $node5 ($node4->childNodes){if( $node5->nodeName() eq 'node'){$txt = getAttribute($node5);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);
注意关键这一句:my $dom = $p->load_xml(location => $file);
上一篇对应这句:my $doc = $parser->parse_file($file);
运行 perl test_LibXML_dom.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.结果
参阅:The Document Object Model — Perl XML::LibXML by Example documentation