在perl中创建从源代码提取xml标记的解析器?

在perl中创建从源代码提取xml标记的解析器?,perl,Perl,我必须从c代码中提取xml注释。我尝试使用perl regexp,但无法提取注释。有人能帮我吗。我的代码如下所示 Dima_chkTimeValidation(&dacl_ts_pumpPWMLowNoDos_str, &dacl_ti_pumpPWMLowNoDos_U16, ti_valid_U16, ti_inval_U16,

我必须从c代码中提取xml注释。我尝试使用perl regexp,但无法提取注释。有人能帮我吗。我的代码如下所示

   Dima_chkTimeValidation(&dacl_ts_pumpPWMLowNoDos_str,
                       &dacl_ti_pumpPWMLowNoDos_U16,
                       ti_valid_U16,
                       ti_inval_U16,
                       (tB)(dacl_r_pumpPwmResidualFilt_S16 < r_testlimit_S16),
                       (tB)((testCond_B == TRUE) && (dosingActive_B == FALSE)),
                       TRUE);
  /*****************************************/
  /*xml comments*/
  /****************************************/

 <DTC>
  <TroubleCode>1101</TroubleCode> 
  <Classification>FAULT</Classification> 
  <SelfHealing>No selfhealing</SelfHealing> 
  <WarningLamp>No Warning Lamp</WarningLamp> 
  <DirectDegradation>No Action</DirectDegradation> 
  <Order>PRIMARY</Order> 
   </DTC>
     /*******************************/
  /* Dosing clogg test           */
  /*******************************/
  /* special test when run i sequence test mode SMHD_DOSVALVE_E */
  if ((s_seqTestCtrlStatus_E == SMHD_RUNNING_E) && (s_seqTestMainState_SMHD_DOSVALVE_E))
  {
    /* Use result from DDOS test */
    Dima_chkValidation(&dacl_ts_pumpPWMLowDos_str,
                       (tB)(s_dosValveTest_E == SMHD_TESTFAILED_E),
                       (tB)(s_dosValveTest_E != SMHD_TESTNOTFINISHED_E));
   }
Dima\u chkTimeValidation(&dacl\u ts\u pumpPWMLowNoDos\u str、,
&dacl_ti_Pumpwmlownodos_U16,
ti_valid_U16,
蒂瓦卢16号,
(tB)(dacl_r_PumppWM剩余过滤器S16

如上所示,我在xml注释前后都有很多c代码行,但我只发布了很少的c代码,我在c代码中添加了一些注释,我需要按原样提取注释。因此,任何人都可以帮助我如何使用perl进行提取

至少可以说,你的数据很奇怪。我在这里做了两个假设:
是示例字符串的起始分隔符,您希望提取尖括号之间的内容(根据标准,尖括号既不是XML,也不是XML注释)。不能保证不会误发嵌入式C代码

use 5.010;
use Data::Dumper qw(Dumper);

say Dumper \%+ while
'<dtcnumber>1223<dtcnumber>
 <discription>battery short circuited<discription>
   <cause>due to unproper connections<cause>
  main();
  {
   ..........
   ...
   c code.
   ...
    };' =~ /<(?<key>[^>]+)>(?<value>[^<]+)<\g{key}>/g;

至少可以说,你的数据很奇怪。我在这里做了两个假设:
是示例字符串的起始分隔符,您希望提取尖括号之间的内容(根据标准,尖括号既不是XML,也不是XML注释)。不能保证不会误发嵌入式C代码

use 5.010;
use Data::Dumper qw(Dumper);

say Dumper \%+ while
'<dtcnumber>1223<dtcnumber>
 <discription>battery short circuited<discription>
   <cause>due to unproper connections<cause>
  main();
  {
   ..........
   ...
   c code.
   ...
    };' =~ /<(?<key>[^>]+)>(?<value>[^<]+)<\g{key}>/g;

为您的工作编写完整的代码不是一个好主意,但我仍在这样做,以便您能够了解如何处理特定问题

在这里,我为您提供了最简单的方法(可能效率不高)

1.让您的输入数据保持简单,让您的生活更简单。识别一个特定的模式,代码可以使用该模式识别XML的开始和结束。 Dima_chkTimeValidation(&dacl_ts_pumpPWMLowNoDos_str, &dacl_ti_pumpPWMLowNoDos_U16, ti_valid_U16, ti_inval_U16, (tB)(dacl_r_pumpPwmResidualFilt_S16 < r_testlimit_S16), (tB)((testCond_B == TRUE) && (dosingActive_B == FALSE)), TRUE); /*****************************************/ /*[[[ Start XML < DTC > < TroubleCode > 1101 < /TroubleCode > < Classification > FAULT < /Classification > < SelfHealing > No selfhealing < /SelfHealing > < WarningLamp > No Warning Lamp lt /WarningLamp > < DirectDegradation > No Action < /DirectDegradation > < Order > PRIMARY < /Order > < /DTC > End XML]]]*/ /*******************************/ /* special test when run i sequence test mode SMHD_DOSVALVE_E */ if ((s_seqTestCtrlStatus_E == SMHD_RUNNING_E) && (s_seqTestMainState_SMHD_DOSVALVE_E)) { /* Use result from DDOS test */ Dima_chkValidation(&dacl_ts_pumpPWMLowDos_str, (tB)(s_dosValveTest_E == SMHD_TESTFAILED_E), (tB)(s_dosValveTest_E != SMHD_TESTNOTFINISHED_E)); } Dima_chkTimeValidation(&dacl_ts_pumpPWMLowNoDos_str.), &dacl_ti_Pumpwmlownodos_U16, ti_valid_U16, 蒂瓦卢16号, (tB)(dacl_r_PumppWM剩余过滤装置S16和lt r_测试极限装置S16), (tB)((testCond_B==真)和&(dosingActive_B==假)), 正确的); /*****************************************/ /*[[[Start XML] < DTC> </TroubleCode> 1101</TroubleCode> <分类>故障</分类> <自愈>无自愈</自愈> <警告灯>无警告灯lt/警告灯> <直接降级>不采取行动</directdegrade> <订单>主订单</订单> </DTC> 结束XML]]]*/ /*******************************/ /*运行i顺序测试模式时的特殊测试*/ 如果((s_Seq TestCtrlStatus_E==SMHD_RUNNING_E)和&(s_Seq TestMainstate_SMHD_DOSVALVE_E)) { /*DDOS测试的使用结果*/ Dima_chkValidation和dacl_ts_pumpPWMLowDos_str, (tB)(s_dosValveTest_E==SMHD_TESTFAILED_E), (tB)(s_dosValveTest_E!=SMHD_test notfinished_E)); } 在这里,您可以确定我用来检测xml开始和结束的模式

2.接下来是代码。现在,除了正则表达式之外,我尝试用“C”的方式写它。

#!/usr/bin/perl
#
#
打开(FD,< Code.cpp)或死“无法打开文件:$!\n”;
我的$start_xml=0;##0表示错误条件..即XML未启动或XML已结束
##1表示xml已启动。
while(< FD>){
咀嚼(美元);
##仅处理单行注释
我的$temp=$\;
如果($temp=~m/\[\[\[\s*start\s*xml/ig&&$start\u xml==0){}检查是否找到了启动xml模式
$start_xml=1;
next;##等价于C的continue
}
如果($temp=~m/<[a-z0-9-&!@]+>.*/ig)和($start_xml==1)){###您可以添加可能出现的其他字母
##如您所知,在这种情况下,模式匹配是不必要的
#您已经在开始和结束XML模式之间获得了XML数据。。。
#在某些情况下,你可能需要它
打印“$temp\n”##我正在打印,但您可以将其写入文件
}elsif($temp=~m/end\s*xml\s*\]\]\]\]/ig){
$start_xml=0;
最后一个;##相当于在C中打断
}
}
关闭FD;

注意:“<”和“>”标记后的文本和代码中没有<空格>。因此,在运行代码时请删除该空间。

选择用于检测取自“Python cog”的xml的模式类型:
为您的工作编写完整的代码不是一个好主意,但我仍在这样做,以便您了解如何处理特定问题

在这里,我为您提供了最简单的方法(可能效率不高)

1.让您的输入数据保持简单,让您的生活更简单。识别一个特定的模式,代码可以使用该模式识别XML的开始和结束。 Dima_chkTimeValidation(&dacl_ts_pumpPWMLowNoDos_str, &dacl_ti_pumpPWMLowNoDos_U16, ti_valid_U16, ti_inval_U16, (tB)(dacl_r_pumpPwmResidualFilt_S16 < r_testlimit_S16), (tB)((testCond_B == TRUE) && (dosingActive_B == FALSE)), TRUE); /*****************************************/ /*[[[ Start XML < DTC > < TroubleCode > 1101 < /TroubleCode > < Classification > FAULT < /Classification > < SelfHealing > No selfhealing < /SelfHealing > < WarningLamp > No Warning Lamp lt /WarningLamp > < DirectDegradation > No Action < /DirectDegradation > < Order > PRIMARY < /Order > < /DTC > End XML]]]*/ /*******************************/ /* special test when run i sequence test mode SMHD_DOSVALVE_E */ if ((s_seqTestCtrlStatus_E == SMHD_RUNNING_E) && (s_seqTestMainState_SMHD_DOSVALVE_E)) { /* Use result from DDOS test */ Dima_chkValidation(&dacl_ts_pumpPWMLowDos_str, (tB)(s_dosValveTest_E == SMHD_TESTFAILED_E), (tB)(s_dosValveTest_E != SMHD_TESTNOTFINISHED_E)); } 迪马