xml_GNode*
xml_path_node (xml_GNode* tree, const gchar* xpath)
{
if (! tree || ! xpath) return 0;
___ xml_GNode* node = tree;
if (xpath[0] == '.') xpath++;
if (xpath[0] == '/') xpath++;
if (xpath[0] == '/') xpath++;
again:
___ const gchar* end = advance_to_name_end (xpath);
if (end == xpath) return (*end ? 0 : node);
___ int serial = 0;
if (end[0] == '[' && g_ascii_isdigit (end[1]))
serial = strtol (&end[1], 0, 0);
if (0) {
if (serial)
g_printerr ("<%.*s[%i]>", end-xpath, xpath, serial);
else
g_printerr ("<%.*s>", end-xpath, xpath);
} |
if (serial < 1) serial = 1;
node = node->children;
for (; node ; node = node->next)
{
if (! node->name) continue;
if (! strncmp (node->name, xpath, end-xpath))
{
if (! --serial) break;
} |
} |
____;
if (! node) return node;
if (end[0] == '[')
{
end++; while (g_ascii_isalnum(*end)) end++;
if (end[0] != ']') return 0; else end++;
} |
if (end[0] == 0) return node;
if (end[0] != '/') return 0;
xpath = end+1; goto again;
____;____;
} |
|