Libxml 2の簡単な紹介と応用

8619 ワード

Libxml 2応用及び詳細
XMLは設計の最悪のフォーマットかもしれませんが、ファイルフォーマットとしては本当に拡張能力がなく、通常は完全な災害です.2014年3月6日-Linus Torvalds XMLはでたらめです.解析XMLは人間にとって嫌であり、コンピュータにとっても災難である.この恐ろしいごみを存在させる理由はない.2014年3月6日.-Linus Torvalds
tips: 1.注意事項:子供ノードを表す子供ノードにはフォーマットが必要です
node1 = cur->xmlChildrenNode;
node2 = node1->xmlChildrenNode->next;

2.質問
デフォルトのLibxml 2は、XMLファイルを書き込むときに、すべての内容を1行に書くので、テキストの表示が不便です.実はLibxml 2はフォーマットされたXMLファイルを生成することができます.解決策
(1)スイッチを入れる:
xmlKeepBlanksDefault(0);  
xmlIndentTreeOutput = 1;  

(2)このスイッチは、XMLノードがDOMツリーに追加される前に開く必要があることに注意してください.すなわち、XMLファイルを作成する前またはXMLファイルをロードする前に(3)ファイルを保存するときにxmlSaveFormatFileまたはxmlSaveFormatFileEncまたはxmlSaveFormatFileToを使用し、最後のパラメータformat=1フォーマットの説明を設定します.Libxml 2はunixの下のライブラリであるため、フォーマットXMLを生成するには改行文字しかありません.リターン記号はなく、インデントはタブではなくスペース記号です.
3.xmlCharタイプはxmlパッケージのcharタイプですが、最後にxmlFree()が必要です.
を選択します.
  • xmlCharは挿入の代わりにUTF-8で符号化された文字列を使用し、xmlFree()の解放を覚えています.
  • xmlDocは解析ドキュメントによって構築されたツリー構造を含み、xmlNodePtrはこの構造を指すポインタ、ルートノードである.
  • xmlNodePtrとxmlNodeは単一の構造を含み、xmlNodePtrはこの構造を指すポインタであり、ドキュメントを遍歴するために使用される.

  • 部分関数の説明
    //      
    xmlDocPtr doc;
    
    //      
    doc = xmlParseFile(file_name);
    
    //   version = 1.0    
    doc = xmlNewDoc(BAD_CAST"1.0");
    
    // GB2312      
    doc = xmlReadFile(docname,"GB2312",XML_PARSE_RECOVER);
    
    //         ,  utf-8      
    xmlSaveFormatFileEnc(phone_book_file, doc, "UTF-8", 1);
    
    //            
    xmlSaveFile("test.xml", doc);
    
    //        /         
    xmlSaveFormatFileEnc("-", doc, encoding, 1);
    
    //            
    xmlFreeDoc(doc);
    //      
    xmlNodePtr cur;
    
    //    
    root_node = xmlNewNode(NULL, BAD_CAST"root");
    
    //            
    xmlNewProp(root_node, "value", (xmlChar *)"123");
    
    //          
    xmlDocSetRootElement(doc, root_node);
    
    //       
    cur = xmlDocGetRootElement(doc);
    
    //        
    cur = cur->xmlChildrenNode;
    
    xmlChar *key
    //         ,      
    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
    
    //  xmlNodeListGetString             
    xmlFree(key);
    
    //                  ,123,  NULL     
    xmlNewTextChild (cur, NULL, "keyword", "123");
    
    //           
    xmlNodeSetContent(cur, (xmlChar *) "1");
    
    //     
    xmlGetProp(cur, "value");
    
    //       value       1000
    xmlSetProp(curNode,BAD_(xmlChar *)"value", (xmlChar *) "1000");
    
    // root_node     node
    xmlAddChild(root_node,node);
    
    // root_node     node
    xmlNewChild(root_node, NULL, (xmlChar *) "node",(xmlChar *) szOut);
    
    //           (unlink),                
    xmlUnlinkNode(curNode);
    
    //           ,    xmlDelNode  xmlRemoveNode,     
    xmlFreeNode(curNode);

    いくつかのパッケージ関数
  • xmlMalloc動的割り当てメモリ
  • xmlFreeリリースメモリ(xmlChar*)
  • xmlStrcmp文字列比較関数
  • xml 2-config–cflags取得前処理とコンパイルフラグ
  • xml 2-config–libs取得リンクフラグ
  • xmlファイルの作成例
    コンパイルコマンド:gcc creat_xml.c -o creat_xml -I/usr/include/libxml2/-lxml2
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    /****************************************
     *  libxml ,  xml  
     *  xml    ,        
     *
     *@author: wxlinux  @date: 2017/10/29
     * ***************************************/
    
    
    #define DEFAULT_XML_FILE "  _t.xml"
    
    static int create_phone_books(const char *filename)
    {
        xmlDocPtr doc = NULL;
        xmlNodePtr root_node = NULL;
        xmlNodePtr node_ = NULL;
        xmlNodePtr node_1 = NULL;
        xmlNodePtr node_2 = NULL;
        xmlNodePtr node_3 = NULL;
        // xmlKeepBlanksDefault(0);  
        // xmlIndentTreeOutput = 1; 
        //    xml   
        doc = xmlNewDoc(BAD_CAST"1.0");
        if(doc == NULL)
        {
            printf("failed to new doc .
    "
    ); goto FAILED; } // root_node = xmlNewNode(NULL, BAD_CAST"root"); if(root_node == NULL) { printf("failed to new root node.
    "
    ); goto FAILED; } node_ = xmlNewNode(NULL, BAD_CAST"brand"); xmlNewProp(node_, "name", (xmlChar *)"DS"); node_1 = xmlNewNode(NULL, BAD_CAST"series"); xmlNewProp(node_1, "name", (xmlChar *)"DS5"); node_2 = xmlNewNode(NULL, BAD_CAST"style"); xmlNewProp(node_2, "name", (xmlChar *)"2014 "); node_3 = xmlNewNode(NULL, BAD_CAST"type"); xmlNewProp(node_3, "name", (xmlChar *)" "); xmlDocSetRootElement(doc, root_node); xmlAddChild(root_node, node_); xmlAddChild(node_, node_1); xmlAddChild(node_1, node_2); xmlAddChild(node_2, node_3); xmlSaveFormatFileEnc(filename, doc, "UTF-8", 1); xmlFreeDoc(doc); return 0; FAILED: if(doc) { xmlFreeDoc(doc); } return -1; } int main(int argc, char const *argv[]) { char *xml_file = DEFAULT_XML_FILE; create_phone_books(xml_file); return 0; }

    xmlファイルの解析