создание парсера в perl, извлекающего теги xml из исходного кода? - PullRequest
0 голосов
/ 22 сентября 2011

Мне нужно извлечь комментарии xml из кода c. Я пытался использовать регулярное выражение perl, но не могу извлечь комментарии. Может кто-нибудь мне помочь. мой код, как показано ниже.

   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));
   }

как показано выше, у меня есть много строк кода c до и после комментариев xml, но я опубликовал только небольшой код c, я добавил несколько комментариев в коде c, мне нужно извлечь комментарии как есть так что любое тело может помочь мне, как извлечь с помощью Perl.

Ответы [ 2 ]

4 голосов
/ 22 сентября 2011

Ваши данные, по меньшей мере, странные. Здесь я делаю два предположения: ' является начальным разделителем примера строки, и вы хотите извлечь содержимое между угловыми скобками (которые не являются ни 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;

выход

$VAR1 = {
          'value' => '1223',
          'key' => 'dtcnumber'
        };

$VAR1 = {
          'value' => 'battery short circuited',
          'key' => 'discription'
        };

$VAR1 = {
          'value' => 'due to unproper connections',
          'key' => 'cause'
        };
0 голосов
/ 22 сентября 2011

Не стоит писать весь код для вашей работы, но я все еще делаю это, чтобы вы могли понять, как подходить к конкретной проблеме.

Здесь я предоставляю вамсамый простой подход (может быть неэффективным)

1. Упростите ввод данных и упростите свою жизнь.Определите конкретный шаблон, с помощью которого ваш код может идентифицировать начало и конец XML.

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

  /*[[[ Start XML  

 &lt DTC &gt
  &lt TroubleCode &gt 1101 &lt /TroubleCode &gt 
  &lt Classification &gt FAULT &lt /Classification &gt 
  &lt SelfHealing &gt No selfhealing &lt /SelfHealing &gt 
  &lt WarningLamp &gt No Warning Lamp lt /WarningLamp &gt 
  &lt DirectDegradation &gt No Action &lt /DirectDegradation &gt 
  &lt Order &gt PRIMARY &lt /Order &gt 
   &lt /DTC &gt

   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));
   }

Здесь вы можете определить шаблон, который я сохранил для определения начала xml и конца xml

2. Далее идет код.Теперь я попытался написать это так же "C", за исключением регулярных выражений.

#!/usr/bin/perl # # open(FD,"&lt Code.cpp") or die "unable to open file: $!\n"; my $start_xml = 0 ; ## 0 indicates false condition ..i.e either XML not started or XML ended ## 1 means xml has started. while(&lt FD &gt){ chomp($_); ## Handling only single Line comments my $temp = $_; if($temp =~ m/\[\[\[\s*start\s*xml/ig && $start_xml == 0){ ## Check if start xml pattern found $start_xml = 1; next; ## equivalent to continue of C } if(($temp =~ m/&lt [a-z0-9 -&!@]+ &gt.*/ig) && ($start_xml == 1)){ ## You can add additional letters that may come ## In such cases pattern matching wont be necessary as you know # you have got XML data between start and end xml pattern. But still... # some case you might need it print "$temp\n"; ## I am printing it out , but you may write it to file }elsif($temp =~ m/end\s*xml\s*\]\]\]/ig){ $start_xml = 0; last; ## equivalent to break in C } } close FD;

ПРИМЕЧАНИЕ :: В тексте и в теге <пробел> после «<» и после «>»код.Итак, удалите это пространство, когда вы запускаете код.

Тип шаблона, выбранный для обнаружения xml, взятого из "Python cog" :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...