2011-09-22 21 views
0

Cコードからxmlコメントを抽出する必要があります。perl regexpを使ってみましたが、コメントを抽出できません。誰でも私を助けることができます。私のコードは以下の通りです。 I上記のショーとしてソースコードからxmlタグを抽出する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)); 
    } 

XMLコメントの前と後のCコードの行の多くを持っていますが、私はほんの少しのCコードを掲示し、私はCコードにいくつかのコメントを追加しました、私はそれがあるとしてコメントを抽出する必要があります。どのようにしても、どのようにしてperlを使って抽出するのか助けてくれるはずです

+0

あなたの "コード" 任意のXMLが含まれていません! – tadmc

+0

こんにちは私のソースコードは、CコードとXMLコメントの組み合わせです。私のコードはXMLのコメントを持っています。 – verendra

+0

XMLコメントは、<! - cooment here - >で区切られています。あなたが私たちに示したことにXMLコメントはありません。 <のように、XMLの終了タグにスラッシュが付きます。1223。あなたはXMLの終了タグを持っていないので、あなたはXMLを持っていません。 – tadmc

答えて

0

そのないあなたの仕事のために全体のコードを記述することをお勧めしていますが、アプローチする方法のアイデアを得ることができるように、私はまだそれをしています特に問題。ここで

、私はあなたの最も簡単な方法を提供しています(効率的ではないかもしれません)

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

はここでは、私は、XMLの開始を検出するために、保持しているパターンとxmlの終わり

2.次を識別することができ、コードです。今私は正規表現を除いて "C"のように書くようにしました。

 
#!/usr/bin/perl 
# 
# 
open(FD,"< 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(< FD >){ 

     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/< [a-z0-9 [email protected]]+ >.*/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; 

NOTE ::後に "&LT" とテキストで、コード内のタグ "&GT" の後に何の&LTスペース&GTはありません。したがって、コードを実行しているときにそのスペースを削除してください。

"PythonのCOG" から取られたXMLを検出するために、選択したパターンの種類:)

+0

こんにちは、皆さん、本当にありがとうございました。私はこれのようにしてみます。 – verendra

+0

こんにちは、このコードは実行されていません、私はunintilized $ _エラーの使用を得ています。私は$ line = $ _をintilizeしようとしました。まだエラーが発生しています。 – verendra

+0

スカラーchompとpattranのマッチングでunintilized $ _を使用するようなエラーが発生しました。このエラー – verendra

4

あなたのデータは、奇妙です。私はここで2つの仮定をしています:'は、例の文字列の開始区切り文字であり、角括弧(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

クールメソッド。+1 – Arunmu

+0

こんにちは、あなたの返信をありがとう、私はいくつかのアイデアを持って、私はあなたが上記のようにしようとします。 – verendra