From 0a4d3f34a8aee74019759ace24f84672a98122b4 Mon Sep 17 00:00:00 2001 From: rootavish Date: Sat, 24 May 2014 05:38:31 +0530 Subject: XML parsing for ePub using libxml some functions were written which will be used to get keywords,attributes from files such as the ePub container.tried to keep the code generalised so as to facilitate reusability of code. --- backend/epub/Makefile.am | 7 +-- backend/epub/epub-document.c | 125 +++++++++++++++++++++++++++++++++++++++++++ backend/epub/epub-document.h | 25 +++++++++ 3 files changed, 154 insertions(+), 3 deletions(-) create mode 100644 backend/epub/epub-document.c create mode 100644 backend/epub/epub-document.h (limited to 'backend') diff --git a/backend/epub/Makefile.am b/backend/epub/Makefile.am index 6ecbdb2a..4371cde8 100644 --- a/backend/epub/Makefile.am +++ b/backend/epub/Makefile.am @@ -1,4 +1,4 @@ -AM_CPPFLAGS = \ +AM_CPPFLAGS = \ -I$(top_srcdir) \ -I$(top_srcdir)/libdocument \ -DMATELOCALEDIR=\"$(datadir)/locale\" \ @@ -9,8 +9,9 @@ AM_CPPFLAGS = \ backend_LTLIBRARIES = libepubdocument.la -libepubdocument_la_SOURCES = - +libepubdocument_la_SOURCES = \ + epub-document.c \ + epub-document.h libepubdocument_la_LDFLAGS = $(BACKEND_LIBTOOL_FLAGS) libepubdocument_la_LIBADD = \ diff --git a/backend/epub/epub-document.c b/backend/epub/epub-document.c new file mode 100644 index 00000000..c6bbf684 --- /dev/null +++ b/backend/epub/epub-document.c @@ -0,0 +1,125 @@ +#include "epub-document.h" + +static xmlDocPtr xmldocument ; +static xmlNodePtr xmlroot ; +static xmlChar* xmlkey ; +static xmlChar* retval ; + +/*Open a XML document for reading */ +gboolean +openXmlDocument ( const gchar* filename ) +{ + xmldocument = xmlParseFile(filename); + + if ( xmldocument == NULL ) + { + return FALSE ; + } + else + { + return TRUE ; + } +} + +/** + *Check if the root value is same as rootname . + *if supplied rootvalue = NULL ,just set root to rootnode . +**/ +gboolean +checkRoot(xmlChar* rootname) +{ + xmlroot = xmlDocGetRootElement(xmldocument); + + if (xmlroot == NULL) { + + xmlFreeDoc(xmldocument); + return FALSE; + } + + if ( rootname == NULL ) + { + return TRUE ; + } + + if ( !xmlStrcmp(xmlroot->name,rootname)) + { + return TRUE ; + } + else + { + return FALSE; + } +} + +xmlChar* +parseXMLchildren( xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ) +{ + xmlNodePtr topchild,children ; + + retval = NULL ; + topchild = xmlroot->xmlChildrenNode ; + + while ( topchild != NULL ) + { + if ( !xmlStrcmp(topchild->name,parserfor) ) + { + if ( rettype == xmlattribute ) + { + retval = xmlGetProp(children,attributename); + return retval; + } + else + { + retval = xmlNodeListGetString(xmldocument,topchild->xmlChildrenNode, 1); + return retval ; + } + } + parseChildren( topchild , parserfor,rettype,attributename) ; + + topchild = topchild->next ; + } + + return retval ; +} + +void parseChildren(xmlNodePtr parent, + xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ) +{ + xmlNodePtr child = parent->xmlChildrenNode ; + + while ( child != NULL ) + { + if ( !xmlStrcmp(child->name,parserfor)) + { + if ( rettype == xmlattribute ) + { + retval = xmlGetProp(child,attributename); + } + else + { + retval = xmlNodeListGetString(xmldocument,child->xmlChildrenNode, 1); + } + return ; + } + + /*return already if we have retval set*/ + if ( retval != NULL ) + { + return ; + } + + parseChildren(child,parserfor,rettype,attributename) ; + child = child->next ; + } +} + +void xmlFreeAll() +{ + xmlFreeDoc(xmldocument); + xmlFree(retval); + xmlFree(xmlkey); +} \ No newline at end of file diff --git a/backend/epub/epub-document.h b/backend/epub/epub-document.h new file mode 100644 index 00000000..157ced04 --- /dev/null +++ b/backend/epub/epub-document.h @@ -0,0 +1,25 @@ +#include +#include +#include +#include + +typedef enum +{ + xmlattribute, + xmlkeyword +}XMLparsereturntype; + +gboolean openXmlDocument ( const gchar* filename ); + +gboolean checkRoot (xmlChar* rootname); + +void parseChildren (xmlNodePtr parent, + xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ); + +xmlChar* parseXMLchildren (xmlChar* parserfor, + XMLparsereturntype rettype, + xmlChar* attributename ); + +void xmlFreeAll(); \ No newline at end of file -- cgit v1.2.1