2

最近Rapidxmlを使用していますが、次の問題に直面しています。ハードコーディングされていないが、プログラムの実行時に生成された属性を追加しようとすると、rapidxmlが間違った文字を挿入します。

これが私のコードのサンプルです:

   void ProcessInfo::retriveInfo()
{
    HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

   PROCESSENTRY32 pe = { sizeof(pe) };  
   BOOL fOk = ProcessFirst( &pe, hSnapshot );

   using namespace rapidxml;
   xml_document<> doc;

   xml_node<>* decl = doc.allocate_node(node_declaration);
   decl->append_attribute(doc.allocate_attribute("version", "1.0"));
   decl->append_attribute(doc.allocate_attribute("encoding", "utf-8"));
   doc.append_node(decl);

   xml_node<>* root = doc.allocate_node(node_element, "rootnode");

   while(fOk)
   {
       std::string processFile = pe.szExeFile;

   xml_node<>* processName = doc.allocate_node(node_element, PROCESS_NODE);
       root->append_node( processName );


       processName->append_attribute(doc.allocate_attribute( PROCESS_NAME, processFile.c_str() ) );

       char szPID[PID_BUFFER];
       memset(szPID, 0x00, sizeof(szPID) );
       itoa(pe.th32ProcessID, szPID, 10 );
       processName->append_attribute(doc.allocate_attribute( PROCESS_ID, szPID ));

       char szParentPID[PID_BUFFER];
       itoa( pe.th32ParentProcessID, szParentPID, 10 );
       processName->append_attribute(doc.allocate_attribute( PROCESS_PARENT_ID, szParentPID ));

       std::cout << processFile.c_str() << " " << szPID <<  " " << szParentPID << std::endl;


       fOk = ProcessNext( &pe, hSnapshot );
   }

   doc.append_node( root );
   std::cout << doc;   

}

エンコーディングに問題があるように見えますが、理解できません。なぜですか?誰か助けてくれませんか?

4

1 に答える 1

5

文字列をRapidXMLに渡すとき、文字列はコピーされず、アドレスを記憶するだけです。したがって、追加した「変数」文字列は上書きされ、RapidXMLドキュメントが破損します。

こちらのセクションをお読みください。

http://rapidxml.sourceforge.net/manual.html#namespacerapidxml_1modifying_dom_tree

特に、次のような変数を使用するallocate_attribute呼び出しを変更する必要があります。-

char *node_name = doc.allocate_string(szPID);        // Allocate string and copy name into it
processName->append_attribute(doc.allocate_attribute(PROCESS_ID, node_name);  // Set node name to node_name

私のこの質問も関連している可能性があります:RapidXML文字列の所有権の懸念を修正する方法は?

于 2012-08-28T15:44:16.283 に答える