Feature #155 XPath - functions
This commit is contained in:
parent
5a597cd71a
commit
2adc7a133a
|
@ -1,5 +1,6 @@
|
|||
1.2.1.2
|
||||
+ Feature #69 Add "current XPath" shortcut
|
||||
+ Feature #155 XPath - functions
|
||||
+ Click on the error message to jump to the error location
|
||||
* Bug #99 fix desktop file (Marco Rodrigues)
|
||||
|
||||
|
|
|
@ -385,7 +385,6 @@ bool WrapLibxml::xpath ( const wxString &xpath, const std::string &utf8DocBuf,
|
|||
|
||||
xmlXPathContextPtr context = NULL;
|
||||
xmlXPathObjectPtr result = NULL;
|
||||
xmlNodeSetPtr nodeset = NULL;
|
||||
|
||||
context = xmlXPathNewContext ( docPtr );
|
||||
if ( !context )
|
||||
|
@ -406,28 +405,7 @@ bool WrapLibxml::xpath ( const wxString &xpath, const std::string &utf8DocBuf,
|
|||
|
||||
bool xpathIsValid = ( result ) ? true : false;
|
||||
|
||||
while ( result != NULL )
|
||||
{
|
||||
if ( xmlXPathNodeSetIsEmpty ( result->nodesetval ) )
|
||||
break;
|
||||
xmlBufferPtr bufferPtr = xmlBufferCreate();
|
||||
if ( bufferPtr == NULL )
|
||||
break;
|
||||
nodeset = result->nodesetval;
|
||||
for ( int i = 0; i < nodeset->nodeNr; i++ )
|
||||
{
|
||||
xmlNodePtr node = nodeset->nodeTab[i];
|
||||
if ( !node )
|
||||
break;
|
||||
xmlNodeDump ( bufferPtr, NULL, node, 0, 1 );
|
||||
|
||||
output += ( const char * ) xmlBufferContent ( bufferPtr );
|
||||
output += '\n';
|
||||
xmlBufferEmpty ( bufferPtr );
|
||||
}
|
||||
xmlBufferFree ( bufferPtr );
|
||||
break;
|
||||
}
|
||||
output = dumpXPathObject ( result );
|
||||
|
||||
xmlXPathFreeObject ( result );
|
||||
xmlXPathFreeContext ( context );
|
||||
|
@ -437,6 +415,96 @@ bool WrapLibxml::xpath ( const wxString &xpath, const std::string &utf8DocBuf,
|
|||
return xpathIsValid;
|
||||
}
|
||||
|
||||
std::string WrapLibxml::dumpXPathObject ( xmlXPathObjectPtr obj )
|
||||
{
|
||||
std::stringstream sstream;
|
||||
if ( !obj )
|
||||
return sstream.str();
|
||||
|
||||
switch ( obj->type )
|
||||
{
|
||||
case XPATH_NODESET:
|
||||
{
|
||||
if ( xmlXPathNodeSetIsEmpty ( obj->nodesetval ) )
|
||||
break;
|
||||
|
||||
xmlBufferPtr bufferPtr = xmlBufferCreate();
|
||||
if ( bufferPtr == NULL )
|
||||
break;
|
||||
|
||||
xmlNodeSetPtr nodeset = obj->nodesetval;
|
||||
for ( int i = 0; i < nodeset->nodeNr; i++ )
|
||||
{
|
||||
xmlNodePtr node = nodeset->nodeTab[i];
|
||||
if ( !node )
|
||||
break;
|
||||
xmlNodeDump ( bufferPtr, NULL, node, 0/*level*/, TRUE/*format*/ );
|
||||
|
||||
sstream << ( const char * ) xmlBufferContent ( bufferPtr )
|
||||
<< '\n';
|
||||
xmlBufferEmpty ( bufferPtr );
|
||||
}
|
||||
xmlBufferFree ( bufferPtr );
|
||||
break;
|
||||
}
|
||||
|
||||
case XPATH_BOOLEAN:
|
||||
sstream << !!obj->boolval;
|
||||
break;
|
||||
|
||||
case XPATH_NUMBER:
|
||||
switch ( xmlXPathIsInf ( obj->floatval ) )
|
||||
{
|
||||
case 1:
|
||||
sstream << wxString ( _("Infinity") ).utf8_str();
|
||||
break;
|
||||
case -1:
|
||||
sstream << wxString ( _("-Infinity") ).utf8_str();
|
||||
break;
|
||||
default:
|
||||
if ( xmlXPathIsNaN ( obj->floatval ) )
|
||||
sstream << wxString ( _("NaN") ).utf8_str();
|
||||
else
|
||||
sstream << obj->floatval;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case XPATH_STRING:
|
||||
sstream << obj->stringval;
|
||||
break;
|
||||
|
||||
case XPATH_POINT:
|
||||
xmlBufferPtr bufferPtr;
|
||||
bufferPtr = xmlBufferCreate();
|
||||
if ( bufferPtr == NULL )
|
||||
break;
|
||||
xmlNodeDump ( bufferPtr, NULL, ( xmlNodePtr ) obj->user,
|
||||
1/*level*/, TRUE/*format*/ );
|
||||
sstream << xmlBufferContent ( bufferPtr );
|
||||
xmlBufferFree ( bufferPtr );
|
||||
break;
|
||||
|
||||
case XPATH_RANGE:
|
||||
case XPATH_LOCATIONSET:
|
||||
case XPATH_XSLT_TREE:
|
||||
default:
|
||||
FILE *fp = tmpfile();
|
||||
xmlXPathDebugDumpObject ( fp, obj, 0/*depth*/ );
|
||||
|
||||
fpos_t size = ftell ( fp );
|
||||
std::string str;
|
||||
str.resize ( size );
|
||||
fseek ( fp, 0, SEEK_SET );
|
||||
fread ( ( char * ) str.c_str(), 1, str.capacity(), fp );
|
||||
fclose ( fp );
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
return sstream.str();
|
||||
}
|
||||
|
||||
bool WrapLibxml::xslt (
|
||||
const wxString &styleFileName,
|
||||
const std::string &utf8DocBuf,
|
||||
|
|
|
@ -76,6 +76,7 @@ class WrapLibxml
|
|||
const wxString &xpath,
|
||||
const std::string &utf8DocBuf,
|
||||
const wxString &docFileName );
|
||||
std::string dumpXPathObject ( xmlXPathObjectPtr obj );
|
||||
bool xslt (
|
||||
const wxString &styleFileName,
|
||||
const std::string &utf8DocBuf,
|
||||
|
|
Loading…
Reference in New Issue