【发布时间】:2017-08-08 03:45:58
【问题描述】:
我在深入解析 xml 文件时遇到问题。为简单起见,假设我有 xmlsoft.org 中提供的这个 xml 文件结构:
<?xml version="1.0"?>
<story>
<storyinfo>
<author>John Fleck</author>
<datewritten>June 2, 2002</datewritten>
<keyword>example keyword</keyword>
</storyinfo>
<body>
<headline>This is the headline</headline>
<para>This is the body text.</para>
</body>
</story>
为了从 xml 的相似文件中检索每个关键字,开发人员使用了这个解决方案:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
void
parseStory (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *key;
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("keyword: %s\n", key);
xmlFree(key);
}
cur = cur->next;
}
return;
}
static void
parseDoc(char *docname) {
xmlDocPtr doc;
xmlNodePtr cur;
doc = xmlParseFile(docname);
if (doc == NULL ) {
fprintf(stderr,"Document not parsed successfully. \n");
return;
}
cur = xmlDocGetRootElement(doc);
if (cur == NULL) {
fprintf(stderr,"empty document\n");
xmlFreeDoc(doc);
return;
}
if (xmlStrcmp(cur->name, (const xmlChar *) "story")) {
fprintf(stderr,"document of the wrong type, root node != story");
xmlFreeDoc(doc);
return;
}
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"storyinfo"))){
parseStory (doc, cur);
}
cur = cur->next;
}
xmlFreeDoc(doc);
return;
}
int
main(int argc, char **argv) {
char *docname;
if (argc <= 1) {
printf("Usage: %s docname\n", argv[0]);
return(0);
}
docname = argv[1];
parseDoc (docname);
return (1);
}
我的疑问是:例如,<storyinfo> 是否有另一个属性,例如
<storyinfo>
...
<rev>
<id> 26546 </id>
</rev>
</storyinfo>
我如何从<rev> 访问/ printf(例如)<id>?归根结底,再一次,我怎样才能越来越深入地得到我想要的东西?对于上面的例子,我试过了,没有成功:
在 parseDoc 函数的 xmlFreeDoc(doc) 行之前添加这个
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"rev"))){
parseRev (doc, cur);
}
cur = cur->next;
}
新建一个函数,parseRev(xmlDocPtr doc, xmlNodePtr cur):
void
parseRev (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *key;
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"id"))) {
key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("id: %s\n", key);
xmlFree(key);
}
cur = cur->next;
}
return;
}
我怎样才能做到这一点?
【问题讨论】:
-
只需使用
storyinfo节点从parseStory调用parseRev。