summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorDavid Sommerseth <davids@redhat.com>2009-04-29 18:32:57 +0200
committerDavid Sommerseth <davids@redhat.com>2009-04-29 18:32:57 +0200
commit2aaa3c0822bff7204167f73b62035bc10f620881 (patch)
tree7e7c10be6fd9a93bbc5529802cf4014078b3e0d0 /src
parentd64ab66e4fbf8d6dfceed628aef21f01063c3d66 (diff)
downloadpython-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.c70
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: