Rapidxml写错了字符

Rapidxml is writing wrong characters

本文关键字:字符 错了 Rapidxml      更新时间:2023-10-16

我最近一直在使用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;   
}

编码似乎有问题,但我搞不清楚,为什么?有人能帮帮我吗?

当您将字符串传递给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

我的这个问题可能也很相关:如何解决RapidXMLString所有权问题?