libxml2如何用于解析XML中的数据?

时间:2011-03-28 22:52:25

标签: c xml parsing libxml2

我已经查看了libxml2代码示例,我对如何将它们拼凑起来感到困惑。

使用libxml2从XML文件中解析或提取数据时需要执行哪些步骤?

我想抓住某些属性并可能存储某些属性的信息。这是怎么做到的?

5 个答案:

答案 0 :(得分:7)

我相信你首先需要创建一个Parse树。也许这篇文章可以提供帮助,请查看How to Parse a Tree with Libxml2部分。

答案 1 :(得分:3)

当我学习使用libxml2构建rss feed解析器时,我发现这两个资源很有用。

Tutorial with SAX interface

Tutorial using the DOM Tree(包含属性值的代码示例)

答案 2 :(得分:3)

libxml2提供了各种显示基本用法的示例。

http://xmlsoft.org/examples/index.html

对于您声明的目标,tree1.c可能最相关。

  

tree1.c:导航树进行打印   元素名称

     

将文件解析为树,使用   xmlDocGetRootElement()来获取root   元素,然后走文件和   打印文档中的所有元素名称   顺序。

http://xmlsoft.org/examples/tree1.c

一旦元素具有xmlNode结构,“properties”成员就是属性的链接列表。每个xmlAttr对象都有一个“name”和“children”对象(分别是该属性的名称/值),以及一个指向下一个属性的“next”成员(或者为最后一个属性为null)。

http://xmlsoft.org/html/libxml-tree.html#xmlNode

http://xmlsoft.org/html/libxml-tree.html#xmlAttr

答案 3 :(得分:2)

在这里,我提到了从Windows平台上的文件中提取XML / HTML数据的完整过程。

  1. 首先下载预先编译的 .dll 表单http://xmlsoft.org/sources/win32/
  2. 还从同一页面下载其依赖 iconv.dll zlib1.dll

  3. 将所有.zip文件解压缩到同一目录中。例如:D:\ demo \

  4. iconv.dll zlib1.dll libxml2.dll 复制到 c:\ windows \ system32 < / strong> deirectory

  5. 制作 libxml_test.cpp 文件,并将以下代码复制到该文件中。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <libxml/HTMLparser.h>
    
    void traverse_dom_trees(xmlNode * a_node)
    {
        xmlNode *cur_node = NULL;
    
        if(NULL == a_node)
        {
            //printf("Invalid argument a_node %p\n", a_node);
            return;
        }
    
        for (cur_node = a_node; cur_node; cur_node = cur_node->next) 
        {
            if (cur_node->type == XML_ELEMENT_NODE) 
            {
                /* Check for if current node should be exclude or not */
                printf("Node type: Text, name: %s\n", cur_node->name);
            }
            else if(cur_node->type == XML_TEXT_NODE)
            {
                /* Process here text node, It is available in cpStr :TODO: */
                printf("node type: Text, node content: %s,  content length %d\n", (char *)cur_node->content, strlen((char *)cur_node->content));
            }
            traverse_dom_trees(cur_node->children);
        }
    }
    
    int main(int argc, char **argv) 
    {
        htmlDocPtr doc;
        xmlNode *roo_element = NULL;
    
        if (argc != 2)  
        {
            printf("\nInvalid argument\n");
            return(1);
        }
    
        /* Macro to check API for match with the DLL we are using */
        LIBXML_TEST_VERSION    
    
        doc = htmlReadFile(argv[1], NULL, HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET);
        if (doc == NULL) 
        {
            fprintf(stderr, "Document not parsed successfully.\n");
            return 0;
        }
    
        roo_element = xmlDocGetRootElement(doc);
    
        if (roo_element == NULL) 
        {
            fprintf(stderr, "empty document\n");
            xmlFreeDoc(doc);
            return 0;
        }
    
        printf("Root Node is %s\n", roo_element->name);
        traverse_dom_trees(roo_element);
    
        xmlFreeDoc(doc);       // free document
        xmlCleanupParser();    // Free globals
        return 0;
    }
    
  6. 打开Visual Studio Command Promt

  7. 转到D:\ demo目录

  8. 执行 cl libxml_test.cpp /I".\libxml2-2.7.8.win32\include“/I".\iconv-1.9.2.win32\include”/ link libxml2-2.7。 8.win32 \ lib \ libxml2.lib 命令

  9. 使用 libxml_test.exe test.html 命令运行二进制文件(此处test.html可能是任何有效的HTML文件)

答案 4 :(得分:0)

您可以参考this的答案。 在这里,它们将数据存储为结构格式,并通过将结构地址传递给函数来进一步使用。

您可以在c中找到要使用的详细代码。

代码->> this