summaryrefslogtreecommitdiff
path: root/backend/epub/epub-document.c
diff options
context:
space:
mode:
authorrootavish <[email protected]>2014-05-24 05:38:31 +0530
committerrootavish <[email protected]>2014-05-24 05:38:31 +0530
commit0a4d3f34a8aee74019759ace24f84672a98122b4 (patch)
treefc5b775f1656f242e38f23bbf93d86cbcf22d307 /backend/epub/epub-document.c
parent28b2c08f60f54a78596746e204f4d0092587a09a (diff)
downloadatril-0a4d3f34a8aee74019759ace24f84672a98122b4.tar.bz2
atril-0a4d3f34a8aee74019759ace24f84672a98122b4.tar.xz
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.
Diffstat (limited to 'backend/epub/epub-document.c')
-rw-r--r--backend/epub/epub-document.c125
1 files changed, 125 insertions, 0 deletions
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