c - 从 C 程序中的 .xml 文档获取 IP

标签 c xml parsing doc

我正在用 C 编写一个程序,我想从这个 .xml 文档中获取两个 IP。

enter image description here

我是这样做的,但它只返回第一个 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/

相关文章:

c - c 中的结构数组 : giving all the strings same values (with the int it works well). 我该怎么办?

c - 如何从输出文件中删除前导零?

android - 为android编译c程序

c - <puts@plt> 到底是什么意思?

mysql - 使用 JSP 从 mysql 数据库生成 xml

c# - 是否可以从 base64 格式解析证书?

java - 您推荐使用哪个包来用 Java 解析 XML 和 JSON?

java - 如何在 CollapsingToolbarLayout 内设置 Toolbar 的重力?

python - 如何使用 Xpath 抓取 NHL 溜冰者统计数据?

perl - 如何使用 Perl::Mechanize 的解析器迭代 300 页?