diff options
author | David Sommerseth <davids@redhat.com> | 2009-04-29 18:32:57 +0200 |
---|---|---|
committer | David Sommerseth <davids@redhat.com> | 2009-04-29 18:32:57 +0200 |
commit | 2aaa3c0822bff7204167f73b62035bc10f620881 (patch) | |
tree | 7e7c10be6fd9a93bbc5529802cf4014078b3e0d0 /src | |
parent | d64ab66e4fbf8d6dfceed628aef21f01063c3d66 (diff) | |
download | python-dmidecode-2aaa3c0822bff7204167f73b62035bc10f620881.tar.gz python-dmidecode-2aaa3c0822bff7204167f73b62035bc10f620881.tar.xz python-dmidecode-2aaa3c0822bff7204167f73b62035bc10f620881.zip |
Reimplemented the XPath integration
Now the XPath expressions can include XPath functions as well. The
previous implementation only supported XPATH_NODESET results from
XPath queries. Now XPATH_STRING and XPATH_NUMBER results are
supported as well. XPATH_BOOLEAN might be needed later on.
Diffstat (limited to 'src')
-rw-r--r-- | src/xmlpythonizer.c | 70 |
1 files changed, 43 insertions, 27 deletions
diff --git a/src/xmlpythonizer.c b/src/xmlpythonizer.c index fb8c8bb..0b6c54e 100644 --- a/src/xmlpythonizer.c +++ b/src/xmlpythonizer.c @@ -330,11 +330,6 @@ xmlXPathObject *_get_xpath_values(xmlXPathContext *xpctx, const char *xpath) { assert( xp_obj != NULL ); free(xp_xpr); - if( (xp_obj->nodesetval == NULL) || (xp_obj->nodesetval->nodeNr == 0) ) { - xmlXPathFreeObject(xp_obj); - return NULL; - } - return xp_obj; } @@ -351,8 +346,8 @@ inline char *_get_key_value(ptzMAP *map_p, xmlXPathContext *xpctx, int idx) { case ptzINT: case ptzFLOAT: xpobj = _get_xpath_values(xpctx, map_p->key); + key = dmixml_GetXPathContent(xpobj, idx); if( xpobj != NULL ) { - key = dmixml_GetContent(xpobj->nodesetval->nodeTab[idx]); xmlXPathFreeObject(xpobj); } break; @@ -361,20 +356,43 @@ inline char *_get_key_value(ptzMAP *map_p, xmlXPathContext *xpctx, int idx) { fprintf(stderr, "Unknown key type: %i\n", map_p->type_key); break; } - if( key == NULL ) { - fprintf(stderr, "Could not find the key value: %s\n", map_p->key); - } return key; } #define PyADD_DICT_VALUE(p, k, v) { \ - if( k != NULL ) { \ - PyDict_SetItemString(p, k, v); \ - Py_DECREF(v); \ - } \ + PyDict_SetItemString(p, k, v); \ + Py_DECREF(v); \ } +inline void _add_xpath_result(PyObject *pydat, xmlXPathContext *xpctx, ptzMAP *map_p, xmlXPathObject *value) { + int i = 0; + char *key = NULL; + + assert( pydat != NULL && value != NULL ); + + switch( value->type ) { + case XPATH_NODESET: + for( i = 0; i < value->nodesetval->nodeNr; i++ ) { + key = _get_key_value(map_p, xpctx, i); + if( key != NULL ) { + char *val = NULL; + val = dmixml_GetXPathContent(value, i); + PyADD_DICT_VALUE(pydat, key, StringToPyObj(map_p->type_value, val)); + } + } + break; + default: + key = _get_key_value(map_p, xpctx, 0); + if( key != NULL ) { + char *val = NULL; + val = dmixml_GetXPathContent(value, 0); + PyADD_DICT_VALUE(pydat, key, StringToPyObj(map_p->type_value, val)); + } + break; + } +} + // Internal XML parser routine, which traverses the given mapping table, // returning a Python structure accordingly to the map. PyObject *_do_pythonizeXML(ptzMAP *in_map, xmlXPathContext *xpctx, int lvl) { @@ -391,10 +409,11 @@ PyObject *_do_pythonizeXML(ptzMAP *in_map, xmlXPathContext *xpctx, int lvl) { // Get 'value' value switch( map_p->type_value ) { case ptzCONST: - value = PyString_FromString(map_p->value); key = _get_key_value(map_p, xpctx, 0); - PyADD_DICT_VALUE(retdata, key, value); - + if( key != NULL ) { + value = PyString_FromString(map_p->value); + PyADD_DICT_VALUE(retdata, key, value); + } break; case ptzSTR: @@ -403,12 +422,7 @@ PyObject *_do_pythonizeXML(ptzMAP *in_map, xmlXPathContext *xpctx, int lvl) { case ptzBOOL: xpobj = _get_xpath_values(xpctx, map_p->value); if( xpobj != NULL ) { - for( i = 0; i < xpobj->nodesetval->nodeNr; i++ ) { - value = StringToPyObj(map_p->type_value, - dmixml_GetContent(xpobj->nodesetval->nodeTab[i])); - key = _get_key_value(map_p, xpctx, i); - PyADD_DICT_VALUE(retdata, key, value); - } + _add_xpath_result(retdata, xpctx, map_p, xpobj); xmlXPathFreeObject(xpobj); } break; @@ -421,8 +435,9 @@ PyObject *_do_pythonizeXML(ptzMAP *in_map, xmlXPathContext *xpctx, int lvl) { value = PyList_New(0); if( xpobj != NULL ) { for( i = 0; i < xpobj->nodesetval->nodeNr; i++ ) { - char *valstr = dmixml_GetContent(xpobj->nodesetval->nodeTab[i]); + char *valstr = dmixml_GetXPathContent(xpobj, i); PyList_Append(value, StringToPyObj(map_p->type_value, valstr)); + free(valstr); } xmlXPathFreeObject(xpobj); key = _get_key_value(map_p, xpctx, 0); @@ -432,11 +447,12 @@ PyObject *_do_pythonizeXML(ptzMAP *in_map, xmlXPathContext *xpctx, int lvl) { case ptzDICT: // Traverse the children to get the value of this element - value = _do_pythonizeXML(map_p->child, xpctx, lvl+1); - Py_DECREF(value); - key = _get_key_value(map_p, xpctx, 0); - PyADD_DICT_VALUE(retdata, key, value); + if( key != NULL ) { + value = _do_pythonizeXML(map_p->child, xpctx, lvl+1); + Py_DECREF(value); + PyADD_DICT_VALUE(retdata, key, value); + } break; default: |