web-dev-qa-db-ja.com

libxml2を使用してXMLからデータを解析するにはどうすればよいですか?

私はlibxml2のコードサンプルを見回しましたが、それらをすべて組み合わせる方法について混乱しています。

Libxml2を使用してXMLファイルからデータを解析または抽出する場合に必要な手順は何ですか?

特定の属性を取得し、場合によってはその情報を保存したいと思います。これはどのように行われますか?

11
system

最初に解析ツリーを作成する必要があると思います。たぶん、この記事が役立つかもしれません、 Libxml2でツリーを解析する方法 と書かれているセクションを見てください。

7
Sadique

Libxml2を使用してrssフィードパーサーを構築する方法を学んでいたときに、これら2つのリソースが役立つことがわかりました。

SAXインターフェースを使用したチュートリアル

DOMツリーを使用したチュートリアル (属性値を含めるためのコード例)

3
Cooper6581

libxml2は、基本的な使用法を示すさまざまな例を提供します。

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

あなたが述べた目標には、tree1.cがおそらく最も関連性があります。

tree1.c:ツリーをナビゲートして要素名を出力します

ファイルをツリーに解析し、xmlDocGetRootElement()を使用してルート要素を取得してから、ドキュメントをウォークし、すべての要素名をドキュメント順に出力します。

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
Jason Viers

ここでは、Windowsプラットフォーム上のファイルからXML/HTMLデータを抽出するための完全なプロセスについて説明しました。

  1. 最初にコンパイル済み。dllフォームをダウンロードします http://xmlsoft.org/sources/win32/
  2. また、その依存関係iconv.dllzlib1.dllを同じものからダウンロードしますページ

  3. すべての.Zipファイルを同じディレクトリに抽出します。例:D:\ demo \

  4. iconv.dllzlib1.dllおよびlibxml2.dllintoc:\ windows\system32deirectory

  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. VisualStudioコマンドプロンプトを開く

  7. D:\ demoディレクトリに移動します

  8. cl libxml_test.cpp /I".\libxml2-2.7.8.win32\include"/I".\iconv-1.9.2.win32\include"/linklibxml2-2.7を実行します。 8.win32\lib\libxml2.libコマンド

  9. libxml_test.exe test.htmlコマンドを使用してバイナリを実行します(ここでは、test.htmlは任意の有効なHTMLファイルです)

2
Pankaj Vavadiya