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


    Freeplane 是一款基于 Java 的开源软件,继承 Freemind 的思维导图工具软件,它扩展了知识管理功能,在 Freemind 上增加了一些额外的功能,比如数学公式、节点属性面板等。

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

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

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

    编写  test_LibXML_dom.pl  如下

    1. #!/usr/bin/perl
    2. use 5.010;
    3. use strict;
    4. use warnings;
    5. use utf8;
    6. use XML::LibXML;
    7. # 解析 Freeplane.mm文件,生成测试用例.csv文件
    8. # xt: 应用系统名的英文或拼音缩写
    9. # testno: 测试用例编号
    10. # zd?: 字段?的拼音缩写
    11. # zd1: 模块名
    12. # zd2: 功能名
    13. # zd3: 正向 或 反向
    14. # zd4: 测试要点
    15. # zd5: 执行步骤
    16. # zd6: 预期结果
    17. # csylms:测试用例描述
    18. if ($#ARGV != 0){
    19. die "You must specify a file.xml to parse";
    20. }
    21. my $file = shift @ARGV;
    22. # 创建一个XML解析器对象
    23. my $p = XML::LibXML->new();
    24. # 解析XML文档
    25. my $dom = $p->load_xml(location => $file)
    26. or die "cannot read file.xml\n";
    27. my $f2 = $file .'.csv';
    28. # 写入文件
    29. open(my $fw, '>:encoding(UTF-8)', $f2) or die "cannot open file '$f2' $!";
    30. print $fw "应用系统名,模块名,测试用例描述,正反向,执行步骤,预期结果\n";
    31. # 要检查一个字符串是否以另一个字符串开始,可使用字符串比较:
    32. sub startsWith {
    33. my ($str, $prefix) = @_;
    34. return substr($str,0, length($prefix)) eq $prefix;
    35. }
    36. my $root = $dom->documentElement;
    37. my($node) = $root->getChildrenByTagName('node');
    38. say '$node is a ', ref($node);
    39. #获取某个节点的TEXT属性和属性值
    40. sub getAttribute {
    41. my($node) = @_;
    42. my @attrs = $node->attributes();
    43. my $txt ='';
    44. foreach my $attr (@attrs) {
    45. if( $attr->nodeName() eq 'TEXT'){
    46. $txt = $attr->value();
    47. $txt =~s/\s+$//;
    48. }
    49. }
    50. return $txt;
    51. }
    52. my $xt = getAttribute($node);
    53. #print $xt;
    54. my ($zd1,$zd2,$zd3,$zd4,$zd5,$zd6,$txt,$csylms);
    55. $zd5 =''; $zd6 ='';
    56. #my @childs = $node->childNodes;
    57. foreach my $node1 ($node->childNodes){
    58. if( $node1->nodeName() eq 'node'){
    59. $zd1 = getAttribute($node1);
    60. foreach my $node2 ($node1->childNodes){
    61. if( $node2->nodeName() eq 'node'){
    62. $zd2 = getAttribute($node2);
    63. foreach my $node3 ($node2->childNodes){
    64. if( $node3->nodeName() eq 'node'){
    65. $zd3 = getAttribute($node3);
    66. foreach my $node4 ($node3->childNodes){
    67. if( $node4->nodeName() eq 'node'){
    68. $zd4 = getAttribute($node4);
    69. foreach my $node5 ($node4->childNodes){
    70. if( $node5->nodeName() eq 'node'){
    71. $txt = getAttribute($node5);
    72. if (startsWith($txt, '步骤:')){
    73. $zd5 = substr($txt, 3);
    74. } elsif (startsWith($txt, '预期结果:')){
    75. $zd6 = substr($txt, 5);
    76. $csylms = $zd2 .'-'. $zd4; # 测试用例描述
    77. print $fw "$xt,$zd1,$csylms,$zd3,$zd5,$zd6\n";
    78. } else {
    79. $zd5 =''; $zd6 ='';
    80. }
    81. }
    82. }
    83. }
    84. }
    85. }
    86. }
    87. }
    88. }
    89. }
    90. }
    91. close($fw);

    注意关键这一句:my $dom = $p->load_xml(location => $file);
    上一篇对应这句:my $doc = $parser->parse_file($file);

    运行 perl test_LibXML_dom.pl your_test.mm 

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

    参阅:The Document Object Model — Perl XML::LibXML by Example documentation

  • 相关阅读:
    报错ssh: Could not resolve hostname
    【Redis】3、Redis主从复制、哨兵、集群
    数据库系统 整体结构化 的理解
    PostgreSQL的学习心得和知识总结(六十二)|语法级自上而下完美实现MySQL数据库的 建表时COMMENT列和表 的实现方案(原生版)
    goland快捷键
    在vs中创建linux项目
    QT信号槽实现分析
    50mm镜头对20m外标定板成像实验
    StartDT奇点云通过CMMI5全球软件领域最高级别成熟度认证
    JaxWsProxyFactoryBean
  • 原文地址:https://blog.csdn.net/belldeep/article/details/136740642