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/epub-document.c | 125 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 backend/epub/epub-document.c (limited to 'backend/epub/epub-document.c') 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 -- cgit v1.2.1