diff options
author | bossiel <bossiel@yahoo.fr> | 2011-08-10 22:59:15 +0000 |
---|---|---|
committer | bossiel <bossiel@yahoo.fr> | 2011-08-10 22:59:15 +0000 |
commit | 1ebf5a5fcda0c9154e22ed02404fd46525a7fd9f (patch) | |
tree | 4b6214a7142ab1035cb0e47444e88af38e712421 /tinySAK/src/tsk_xml.c | |
download | doubango-1.0.zip doubango-1.0.tar.gz |
Move deprecated v1.0 from trunk to branches1.0
Diffstat (limited to 'tinySAK/src/tsk_xml.c')
-rw-r--r-- | tinySAK/src/tsk_xml.c | 296 |
1 files changed, 296 insertions, 0 deletions
diff --git a/tinySAK/src/tsk_xml.c b/tinySAK/src/tsk_xml.c new file mode 100644 index 0000000..0c1c56b --- /dev/null +++ b/tinySAK/src/tsk_xml.c @@ -0,0 +1,296 @@ +/* +* Copyright (C) 2009-2010 Mamadou Diop. +* +* Contact: Mamadou Diop <diopmamadou(at)doubango.org> +* +* This file is part of Open Source Doubango Framework. +* +* DOUBANGO is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* DOUBANGO is distributed in the hope that it will be useful, +* but WITHOUT ANY WARRANTY; without even the implied warranty of +* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +* GNU General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with DOUBANGO. +* +*/ + +/**@file tsk_xml.c + * @brief Useful functions to manipulate xml documents. + * + * @author Mamadou Diop <diopmamadou(at)doubango.org> + * + * @date Created: Sat Nov 8 16:54:58 2009 mdiop + */ +#include "tsk_xml.h" + +#if HAVE_LIBXML2_H + +#include "tsk_string.h" +#include "tsk_memory.h" +#include "tsk_macros.h" + +#include <string.h> + +/**@defgroup tsk_xml_group XML +*/ + +/**@page tsk_xml_page XML Tutorial +*/ + + +/**@ingroup tsk_xml_group +* Initialize an XML namespace +* @param namespace The XML namespace to initialize. +*/ +/*void tsk_xml_namespace_init(tsk_xml_namespace_t* namespace) +{ +}*/ + +/**@ingroup tsk_xml_group +* Free an XML namespace +* @param namespace The namespace to free +*/ +/*void tsk_xml_namespace_free(tsk_xml_namespace_t** namespace) +{ + TSK_FREE((*namespace)->prefix); + TSK_FREE((*namespace)->value); + TSK_FREE(namespace); +}*/ + +/**@ingroup tsk_xml_group +* Initialize an XML element +* @param element The XML element to initialize +*/ +/*void tsk_xml_element_init(tsk_xml_element_t* element) +{ +}*/ + +/**@ingroup tsk_xml_group +* Initialize an XML element and set values +* @param element The XML element to initialize +* @param name The element name +* @param value The element value +* @param type The element type +*/ +void tsk_xml_element_init_set(tsk_xml_element_t** element, const char* name, const char* value, tsk_xml_type_t type) +{ + TSK_XML_ELEMENT_CREATE((*element)); + (*element)->elements = TSK_LIST_CREATE(); + (*element)->attributes = TSK_LIST_CREATE(); + (*element)->namespaces = TSK_LIST_CREATE(); + (*element)->name = tsk_strdup(name); + (*element)->value = tsk_strdup(value); + (*element)->type = type; +} + +/**@ingroup tsk_xml_group +* Free an XML element +* @param _element The XML element to free +*/ +/*void tsk_xml_element_free(void** _element) +{ + tsk_xml_element_t** element = (tsk_xml_element_t**)_element; + + TSK_FREE((*element)->name); + TSK_FREE((*element)->value); + TSK_OBJECT_SAFE_FREE((*element)->elements); + TSK_OBJECT_SAFE_FREE((*element)->attributes); + TSK_OBJECT_SAFE_FREE((*element)->namespaces); + + TSK_FREE(element); +}*/ + +/**@ingroup tsk_xml_group +* Initialize an XML attribute +* @param attribute The XML attribute to initialize +*/ +/*void tsk_xml_attribute_init(tsk_xml_attribute_t* attribute) +{ +}*/ + +/**@ingroup tsk_xml_group +* Free an XML attribute +* @param attribute The XML attribute to free +*/ +/*void tsk_xml_attribute_free(tsk_xml_attribute_t** attribute) +{ + TSK_FREE((*attribute)->name); + TSK_FREE((*attribute)->value); + + TSK_FREE(attribute); +}*/ + +/**@ingroup tsk_xml_group +* Get an XML namespace from an XML document +* @param docPtr A pointer to the XML document +* @param node The XML node from which to extract the namespace +* @param href The namespace href +* @retval The Namespace value matching our criteria (href) +*/ +xmlNsPtr tsk_xml_get_namespace(xmlDocPtr docPtr, xmlNodePtr node, const char *href) +{ + xmlNs *ns = *xmlGetNsList(docPtr, node); + while (ns) + { + if (tsk_striequals(ns->href, href)) return ns; + else ns = ns->next; + } + + return 0; +} + +/**@ingroup tsk_xml_group +* Find an XML node by name +* @param curr The XML node from which to start +* @param name The name of the XML node to find +* @param ftype The find type +* @retval Returns the node which match our criteria. If none match, this method returns NULL. +*/ +xmlNodePtr tsk_xml_find_node(const xmlNodePtr curr, const char* name, tsk_xml_node_find_type_t ftype) +{ + xmlNodePtr node = curr; + + while(node) + { + switch(ftype) + { + case nft_none: return (tsk_striequals(node->name, name))? node : 0; + case nft_children: node = node->children; break; + case nft_parent: node = node->parent; break; + case nft_next: node = node->next; break; + case nft_prev: node = node->prev; break; + default: return 0; + } /* switch */ + + /* check and return value if match */ + if( node && (!name || tsk_striequals(node->name, name)) ) + //if( node && (name == 0 || !tsk_stricmp((const char*)node->name, name)) ) + { + return node; + } + } + + return 0; +} + +/**@ingroup tsk_xml_group +* Select an XML node +* @retval Returns the pointer to the node which match our criteria. If none match, this method returns NULL. +*/ +xmlNodePtr tsk_xml_select_node(const xmlNodePtr root, ...) +{ + va_list list; + int step; + char* root_name = 0; + xmlNodePtr node = root; + + if(!node || !(node->name)) return 0; + + /* initialize variable arguments */ + va_start(list, root); + + while( node && (step=va_arg(list, tsk_xml_node_select_type_t)) != nst_end) + { + switch(step) + { + case nst_by_name: + { /* name */ + const char* qname = va_arg(list, const char*); + if(tsk_striequals(root->name, qname)){ + node = tsk_xml_find_node(node, 0, nft_children); + } + else{ + if(!tsk_striequals(node->name, qname)) + { /* do not match */ + node = tsk_xml_find_node(node, qname, nft_next); + } + else + { /* already match */ + node = node->children; + } + } + break; + } + + case nst_content: + { /**/ + node = tsk_xml_find_node(node, 0, nft_children); + break; + } + + case nst_att_value: + { /* qname, att_name */ + xmlAttrPtr attrPtr = 0; + int found = 0; + const char* qname = va_arg(list, const char*); + const char* att_name = va_arg(list, const char*); + node = tsk_xml_find_node(node, qname, nft_none); + while( node && !found ) + { + attrPtr = node->properties; + while(attrPtr) + { + if(attrPtr->type == XML_ATTRIBUTE_NODE && attrPtr->children) + { + if( tsk_striequals(attrPtr->name, att_name) ){ + node = attrPtr->children; + found = 1; + } + } + attrPtr = attrPtr->next; + } + if(!found) node = tsk_xml_find_node(node, 0, nft_next); + } + break; + } + + case nst_by_att: + { /* qname att_name att_value */ + xmlAttrPtr attrPtr = 0; + int found = 0; + const char* qname = va_arg(list, const char*); + const char* att_name = va_arg(list, const char*); + const char* att_value = va_arg(list, const char*); + node = tsk_xml_find_node(node, qname, nft_none); + while( node && !found ) + { + attrPtr = node->properties; + while(attrPtr) + { + if(attrPtr->type == XML_ATTRIBUTE_NODE && attrPtr->children) + { + if( tsk_striequals(attrPtr->name, att_name) + && ( (attrPtr->children->content && tsk_striequals(attrPtr->children->content, att_value)) || !att_value ) + ){ + found = 1; + } + } + attrPtr = attrPtr->next; + } + if(!found) node = tsk_xml_find_node(node, 0, nft_next); + } + + if(found && node) break; + else return 0; + + break; + } + default: return 0; + } /* switch */ + + /* skip all comments */ + TSK_XML_NODE_SKIP_COMMENTS(node); + + } /* while*/ + + return node; +} + +#endif /* HAVE_LIBXML2_H */ + |