Libxml2: Difference between revisions

From 탱이의 잡동사니
Jump to navigation Jump to search
No edit summary
Line 26: Line 26:


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

Revision as of 11:41, 31 July 2015

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 />