如何获取xmlHashTable的键? (libxml2的)

我正在使用库libxml2来解析XML文档。 然后我在这个库中看到了xmlHashTable 。 是否可以获取xmlHashTable所有键? 我想将所有键存储在一个数组中。

XML文档是:

    <!DOCTYPE dictionary SYSTEM "dictionary.dtd" [                      ]>  ...  

我试图获取外部(解析)实体的所有键(例如nasreq,eap等):

 ddict_t *ddict_scan(const char* system_directory, const char* filename) { char *path = g_strconcat((const gchar*) system_directory, (const gchar*)filename, (const gchar *)'\0'); xmlDocPtr p1 = getdoc((const char *)path); xmlEntitiesTablePtr ptr2 = p1->intSubset->entities; //to be added } 

xmlEntitiesTable的类型是xmlHashTable

有一个xmlHashScan()函数(及其pickier亲属),它可以用来为库提供一个用户提供的xmlHashScanner函数,用于xmlHashTable每个条目。 xmlHashScanner被赋予每个条目的name作为参数,因此应该很容易组装所有键的列表。

您的问题是典型的XY问题 。 获取实体声明的更简单方法是迭代DTD节点的子节点:

 xmlDtdPtr dtd = doc->intSubset; for (xmlNodePtr child = dtd->children; child; child = child->next) { if (child->type == XML_ENTITY_DECL) { printf("%s\n", child->name); } } 

对于那些想要了解更多细节(特别是代码)的人,您可以查看我的以下代码,它可以帮助我获取密钥列表:

 typedef struct _entities_key_list{ xmlChar *name; struct _entities_key_list *next; } entities_key_list; static entities_key_list *head_key_list = NULL; static entities_key_list *current_key_list = NULL; /** * @brief Callback when scanning data in a hash with the simple scanner * @param the data in the hash * @param extra scanner data * @param the name associated * @return void */ void the_callback_function(void *payload, void *data, xmlChar *name){ if(!head_key_list) { head_key_list = current_key_list = g_new(entities_key_list, 1); head_key_list->name = name; head_key_list->next = NULL; } else { current_key_list = current_key_list->next = g_new(entities_key_list, 1); current_key_list->name = name; current_key_list->next = NULL; } } /** * @brief Parses the entity inforamtion in the XML document: dictionary.xml * @param ptr pointer to an XML document * @return pointer to a linked list of type entity_t */ entity_t *parse_entities(xmlDocPtr ptr) { xmlHashScanner ptr27 = &the_callback_function; xmlHashTablePtr ptr28 = (xmlHashTablePtr) ptr->intSubset->entities; xmlHashScan(ptr28, ptr27, NULL); puts("**************************************************"); puts("let's test if I have got the great result!"); printf("the result is: %s\n", head_key_list->name); printf("the result is: %s\n", head_key_list->next->name); puts("**************************************************"); ... //code that is not interesting anymore }