我正在用 C 编写一个程序,我想从这个 .xml 文档中获取两个 IP。
我是这样做的,但它只返回第一个 IP:
void parseGlobalStats(xmlDocPtr doc, xmlNodePtr cur) {
xmlChar *IP;
cur = cur->xmlChildrenNode;
cur = cur->next;
cur = cur->xmlChildrenNode;
while (cur != NULL)
{
if ((!xmlStrcmp(cur->name, (const xmlChar *)"IP")))
{
IP = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
printf("IP = %s\n",IP);
}
return;
}
}
它编译良好,但在执行时仅返回第一个 IP(179.199.24.207)。我如何创建一个从该文档获取 2 个 IP 并将其存储在字符串变量中的函数?
最佳答案
由于您只是在寻找一些全局统计信息(包括 IP
),您可以使用 xpath 评估。
使用 xpath,以下文件 [ test.xml ]:
<icestats>
<source mount="/stream">
<Listeners>2</Listeners>
<listener>
<IP>179.199.24.207</IP>
<UserAgent>cmus/v2.4.3</UserAgent>
<Connected>76810</Connected>
<ID>405</ID>
</listener>
<listener>
<IP>177.133.209.80</IP>
<UserAgent>WinampMPEG/5.0</UserAgent>
<Connected>72</Connected>
<ID>1435</ID>
</listener>
</source>
</icestats>
可以用[ test.c ]提取IP
:
/* refactored [minimal changes] from libxml2 tutorials
* [ http://www.xmlsoft.org/tutorial/apd.html ]
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <libxml/parser.h>
#include <libxml/xpath.h>
xmlDocPtr getdoc (char *docname)
{
xmlDocPtr doc;
doc = xmlParseFile(docname);
if (doc == NULL ) {
fprintf(stderr,"Document not parsed successfully. \n");
return NULL;
}
return doc;
}
xmlXPathObjectPtr getnodeset (xmlDocPtr doc, xmlChar *xpath)
{
xmlXPathContextPtr context;
xmlXPathObjectPtr result;
context = xmlXPathNewContext(doc);
if (context == NULL) {
printf("Error in xmlXPathNewContext\n");
return NULL;
}
result = xmlXPathEvalExpression(xpath, context);
xmlXPathFreeContext(context);
if (result == NULL) {
printf("Error in xmlXPathEvalExpression\n");
return NULL;
}
if(xmlXPathNodeSetIsEmpty(result->nodesetval)){
xmlXPathFreeObject(result);
printf("No result\n");
return NULL;
}
return result;
}
int main(int argc, char **argv)
{
char *docname = "test.xml";
xmlDocPtr doc;
xmlChar *xpath = (xmlChar*) "//IP";
xmlNodeSetPtr nodeset;
xmlXPathObjectPtr result;
int i;
xmlChar *IP;
doc = getdoc(docname);
result = getnodeset (doc, xpath);
if (result)
{
nodeset = result->nodesetval;
for (i=0; i < nodeset->nodeNr; i++)
{
IP = xmlNodeListGetString(
doc,
nodeset->nodeTab[i]->xmlChildrenNode,
1);
printf("IP: %s\n", IP);
xmlFree(IP);
}
xmlXPathFreeObject (result);
}
xmlFreeDoc(doc);
xmlCleanupParser();
return (1);
}
示例输出:
./test
IP: 179.199.24.207
IP: 177.133.209.80
进一步引用
关于c - 从 C 程序中的 .xml 文档获取 IP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20349021/