Libxml2

From 탱이의 잡동사니
Jump to navigation Jump to search

Overview

Libxml2 사용법 정리

Installation

On debian/ubuntu <source lang=bash> $ sudo apt-get install libxml2-dev </source>

On CentOS/RHEL <source lang=bash> $ sudo yum install libxml2-devel </source>

Complie options

libxml2 를 이용한 프로그램을 컴파일하기 위해서는 다음의 옵션이 컴파일 옵션에 포함되어야 한다.

complie option
`xml2-config --cflags`

link option
`xml2-config --libs`

Error handling

xmlGetLastError

마지막에 발생한 에러 내용을 표시한다. Thread와 같이 사용할 경우, Thread 별로 발생한 마지막 에러 내용을 나타낸다.<ref>http://www.xmlsoft.org/html/libxml-xmlerror.html#xmlGetLastError</ref>

xmlErrorPtr	xmlGetLastError		(void)

Get the last global error registered. This is per thread if compiled with thread support.
Returns:	NULL if no error occured or a pointer to the error

<source lang=c> void CXbrlTaxonomy::ReadInXml(const string sXml) {

       xmlDocPtr pXmlDoc = xmlReadMemory(sXml.c_str(), (int)sXml.size(), "xml", NULL, 0);
       if (pXmlDoc == NULL)
       {
               xmlErrorPtr pErr = xmlGetLastError();
               AfxMessageBox(pErr->message);
       }
       else
       {
               xmlXPathContextPtr pXPathCtx = xmlXPathNewContext(pXmlDoc);
                         ...

</source>

Examples

tree_navigator

원문은 이곳<ref>http://www.xmlsoft.org/examples/tree1.c</ref>에서 확인할 수 있다. <source lang=c>

  1. include <stdio.h>
  2. include <libxml/parser.h>
  3. include <libxml/tree.h>
  1. include <stdio.h>
  2. include <libxml/parser.h>
  3. include <libxml/tree.h>
  1. ifdef LIBXML_TREE_ENABLED

/*

*To compile this file using gcc you can type
*gcc `xml2-config --cflags --libs` -o xmlexample libxml2-example.c
*/

/**

* print_element_names:
* @a_node: the initial xml node to consider.
*
* Prints the names of the all the xml elements
* that are siblings or children of a given xml node.
*/

static void print_element_names(xmlNode * a_node) {

   xmlNode *cur_node = NULL;
   for (cur_node = a_node; cur_node; cur_node = cur_node->next) {
       printf("Node type. type[%d]\n", cur_node->type);
       if (cur_node->type == XML_ELEMENT_NODE) {
           printf("node type: Element, name[%s], content[%s]\n", cur_node->name, cur_node->content);
       }
       else if(cur_node->type == XML_TEXT_NODE)
       {
           printf("text[%s]\n", cur_node->content);
       }
       print_element_names(cur_node->children);
   }

}


/**

* Simple example to parse a file called "file.xml", 
* walk down the DOM, and print the name of the 
* xml elements nodes.
*/

int main(int argc, char **argv) {

   xmlDoc *doc = NULL;
   xmlNode *root_element = NULL;
   if (argc != 2)
       return(1);
   /*
    * this initialize the library and check potential ABI mismatches
    * between the version it was compiled for and the actual shared
    * library used.
    */
   LIBXML_TEST_VERSION
   /*parse the file and get the DOM */
   doc = xmlReadFile(argv[1], NULL, 0);
   if (doc == NULL) {
       printf("error: could not parse file %s\n", argv[1]);
   }
   /*Get the root element node */
   root_element = xmlDocGetRootElement(doc);
   print_element_names(root_element);
   /*free the document */
   xmlFreeDoc(doc);
   /*
    *Free the global variables that may
    *have been allocated by the parser.
    */
   xmlCleanupParser();
   return 0;

}

  1. else

int main(void) {

   fprintf(stderr, "Tree support not compiled in\n");
   exit(1);

}

  1. endif

</source>

See also

References

<references />