2011-08-14 9 views
0

私のportscannerプログラムでは、スキャンしたポート番号の出力とサービス名を正常に書きたいと思います。 したがって、各ポート番号、スキャンされたサービス名、私は以下のparseallルーチンを呼び出します。xml解析エラーの属性名が再定義されました

void parseall(int pid, char *scannedby, char *service){ // routine to add port, scannedby and service to xmlfile 

    xmlDocPtr doc; // pointer to parse xml Document 

    xmlNodePtr cur = NULL;// node pointer. It interacts with individual node 

    xmlAttrPtr attr; char portid[10]; 

    sprintf (portid,"%d",pid); // converted int to string 

    doc = xmlParseFile(xmlFileName); //parse filename 

    cur = xmlDocGetRootElement(doc); // get rootnode 

    addnewportinfotag(cur,doc); // this routine adds new portid, scannedby and servicename tags to the xmlfile created 

    cur = cur->xmlChildrenNode; //get pointer 

    parseport(doc, cur, portid); // routine to add port to xmlfile 

while(cur!=NULL){ 

if ((!xmlStrcmp(cur->name, (const xmlChar *)"ports"))){ 

parsehost(doc, cur, scannedby); // routine to add scanned by to xmlfile 

parseservice(doc, cur, service); //routine to add servicename to xmlfile 
} 

cur = cur->next; 

} 

xmlSaveFormatFile (xmlFileName, doc, 1); 

return; 

xmlFreeDoc(doc); 

} 

コードが正常にコンパイルが、私は複数のポートをスキャンするとき、それは以下のように「XMLパースエラー属性名 が再定義」を与える:それはうまく機能し、単一ポートの

 [ Port ] [ Scanned by] [ Status ] [Service] 
    79/tcp  osus   Open  finger 
    80/tcp  bt   Open  www 
    111/tcp  osus   Open  sunrpc 

xmloutput.xml:5: parser error : Attribute portid redefined 
<ports protocol="tcp" portid="79" portid="80"><state state="open" reason="vanill 
              ^
xmloutput.xml:5: parser error : Attribute scannedby redefined 
e state="open" reason="vanilla-scan"/><scannedby scannedby="osus" scannedby="bt" 
                      ^
xmloutput.xml:5: parser error : Attribute name redefined 
"/><scannedby scannedby="osus" scannedby="bt"/><service name="finger" name="www" 
                      ^
Segmentation fault 

をあなたには無効なXMLが生成されています:

<ports protocol="tcp" portid="22"><state state="open" reason="vanilla-scan"/><scannedby scannedby="bt"/><service name="ftp"/></ports></DPScanner> 

答えて

4

同じタグに同じ名前の属性を2つ持つことはできません。

Start-Tags, End-Tags, and Empty-Element Tagsで、仕様を参照してください。

を整形式制約:ユニーク肥満児スペック

属性名はかつて同じ開始タグまたはempty-よりも現れてはなりません要素タグ。

+0

こんにちは、あなたの迅速な対応に感謝します。問題は、新しいタグを作成してポート情報を埋めるのではなく、関数のどこかにあります。次のポート情報を次のポート情報に追加するだけです。何か助けを歓迎するpls – Fahad

+0

それは無効です。同じ 'ports'タグに' port = "..." '属性を付ける必要はありません。ポート番号が属性ではなく子要素であるように、XMLファイルの構造を変更する必要があります。 – Mat

関連する問題