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