int printXPathAtomic (xmlXPathObjectPtr objset, char **printBuffPtr, int printBuffSize) { int retValue; char *res = NULL; int size = printBuffSize; char *newSpace; int n; if (objset == NULL) return -1; switch (objset->type){ case XPATH_STRING: res = strdup ((char *)objset->stringval); break; case XPATH_BOOLEAN: res = (char *)xmlXPathCastBooleanToString(objset->boolval); break; case XPATH_NUMBER: res = (char *) xmlXPathCastNumberToString(objset->floatval); break; } if (res == NULL || strlen (res) == 0){ if (res) free (res); return 0; } if (size < (strlen(res) + 1)){ size = strlen(res) + 1; newSpace = (char *)realloc (*printBuffPtr, size); if (newSpace){ *printBuffPtr = newSpace; } else { // unable to allocate space if (res) free (res); return -1; } } n = sprintf (*printBuffPtr, "%s", res); if (res) free (res); return n; }
bool gpl::xml::getXPathResultSet(std::multimap<std::string, std::string>& resultSet) { resultSet.clear(); //added by shandy 20041208 if (m_xml->resource == NULL) return true; std::vector<std::string> strVector; std::string str, name; int i; xmlNodeSetPtr tmpPtr = 0; //cout<<"resource->type:"<<m_xml->resource->type<<endl; switch (m_xml->resource->type) { case XPATH_UNDEFINED://Object is uninitialized return false; break; case XPATH_NODESET://Object is a Node Set tmpPtr = m_xml->resource->nodesetval; if (tmpPtr == NULL) break; for (i = 0; i < tmpPtr->nodeNr; i++) m_xml->getDumpNode(tmpPtr->nodeTab[i], resultSet); break; case XPATH_XSLT_TREE://Object is an XSLT value tree return false; break; case XPATH_BOOLEAN://Object is a Boolean str = m_xml->getStringByXmlCharPtr(xmlXPathCastBooleanToString(m_xml->resource->boolval), 1); resultSet.insert(std::multimap<std::string, std::string>::value_type(std::string("boolean"), str)); break; case XPATH_NUMBER://Object is a number str = m_xml->getStringByXmlCharPtr(xmlXPathCastNumberToString(m_xml->resource->floatval), 1); resultSet.insert(std::multimap<std::string, std::string>::value_type(std::string("number"), str)); break; case XPATH_STRING://Object is a string if (m_xml->resource->stringval != NULL) { std::string str = m_xml->getStringByXmlCharPtr(m_xml->resource->stringval); resultSet.insert(std::multimap<std::string, std::string>::value_type(std::string("string"), str)); } break; case XPATH_POINT://Object is a point //fprintf(output, " : index %d in node", m_xml->resource->index); m_xml->getDumpNode((xmlNodePtr)m_xml->resource->user, resultSet); break; case XPATH_RANGE: if ((m_xml->resource->user2 == NULL) || ((m_xml->resource->user2 == m_xml->resource->user) && (m_xml->resource->index == m_xml->resource->index2))) { //Object is a collapsed range //if (m_xml->resource->index >= 0) // fprintf(output, "index %d in ", m_xml->resource->index); //fprintf(output, "node\n"); m_xml->getDumpNode((xmlNodePtr)m_xml->resource->user, resultSet); } else { //Object is a range from //if (m_xml->resource->index >= 0) // fprintf(output, "index %d in ", m_xml->resource->index); m_xml->getDumpNode((xmlNodePtr)m_xml->resource->user, resultSet); // to //if (m_xml->resource->index2 >= 0) // fprintf(output, "index %d in ", m_xml->resource->index2); m_xml->getDumpNode((xmlNodePtr)m_xml->resource->user2, resultSet); } break; case XPATH_LOCATIONSET://Object is a Location Set return false; break; case XPATH_USERS://Object is user defined return false; break; } return true; }