初步分析,给我的时间是:一个半月,另外,具体详细需求:不明,摸着石头过河。
当时只有一个感觉:Are you crazy?
其一,Viiv的技术刚刚推出,网上能用的资料少得可怜.大部分都是介绍Viiv的.而非如何与Viiv交互的,仅有的资料就要靠一篇十来页的PDF文档.
其二,由于是嵌入式linux,机种本身不带有xml的parser,需要找一个c语言编写的xml parser集成到linux中.
其三,xml数据是从机器的什么地方收集,发送回的xml数据经分析后要写入哪地方去.都没有说明.
今天一天时间,找了一个C的xml parser,名称叫libxml,用了一下,感觉比较好用.最主要的是document挺全的,如果要下此库,可以到它的主页:http://xmlsoft.org/ 上下载。
此库可以适用多个平台,包括Windows,Linux,Unix,为了以后用得着,以下是我对此库写的一些心得.
------------------------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------------------------
首先,此库定义了一些基本的类型,用得比较多:
a)xmlChar --相当于字符串类型
b)xmlDoc -- 整个文档的结构体
c)xmlNodePtr/xmlNode --结点的结构体
xmlDoc的结构体如下所示:
1
}
xmlNode的结构体:
以下是示例:
打开一个xml文件:
xmlDocPtr doc;
doc = xmlParseFile(docname);
if (doc == NULL ) {
fprintf(stderr,"Document not parsed successfully. \n");
return;
}
获得根元素:
xmlNodePtr cur;
cur = xmlDocGetRootElement(doc);
比较元素的值:
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;
}
获得结点元素的值:
void
parseStory (xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *key;
cur = cur->xmlChildrenNode;
while (cur != NULL) {
if ((!xmlStrcmp(cur->name, (const xmlChar *)"keyword"))) {
printf("keyword: %s\n", key);
xmlFree(key);
}
cur = cur->next;
}
return;
}
注意 :When we find the "keyword" element, we need to print its contents. Remember that in XML, the text contained within an element is a child node of that element, so we turn to cur->xmlChildrenNode. To retrieve it, we use the function xmlNodeListGetString, which also takes the doc pointer as an argument. In this case, we just print it out.
意思是说,结点的值就相当于该结点的ChildrenNode,所以,获得某个结点,要想取其值的话,一定要用结点->xmlChildrenNode.