Changeset d912fe4


Ignore:
Timestamp:
2010-08-14T23:00:53Z (14 years ago)
Author:
Wilmer van der Gaast <wilmer@…>
Branches:
master
Children:
d97f51b
Parents:
4fc95c5
Message:

Add xt_find_path() to simplify digging through multi-level XML trees.

Location:
lib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • lib/xmltree.c

    r4fc95c5 rd912fe4  
    479479}
    480480
     481/* More advanced than the one above, understands something like
     482   ../foo/bar to find a subnode bar of a node foo which is a child
     483   of node's parent. Pass the node directly, not its list of children. */
     484struct xt_node *xt_find_path( struct xt_node *node, const char *name )
     485{
     486        while( name && *name && node )
     487        {
     488                char *colon, *slash;
     489                int n;
     490               
     491                if( ( slash = strchr( name, '/' ) ) )
     492                        n = slash - name;
     493                else
     494                        n = strlen( name );
     495               
     496                if( strncmp( name, "..", n ) == 0 )
     497                {
     498                        node = node->parent;
     499                }
     500                else
     501                {
     502                        node = node->children;
     503                       
     504                        while( node )
     505                        {
     506                                if( g_strncasecmp( node->name, name, n ) == 0 ||
     507                                    ( ( colon = strchr( node->name, ':' ) ) &&
     508                                      g_strncasecmp( colon + 1, name, n ) == 0 ) )
     509                                        break;
     510                               
     511                                node = node->next;
     512                        }
     513                }
     514               
     515                name = slash ? slash + 1 : NULL;
     516        }
     517       
     518        return node;
     519}
     520
    481521char *xt_find_attr( struct xt_node *node, const char *key )
    482522{
  • lib/xmltree.h

    r4fc95c5 rd912fe4  
    8989void xt_free( struct xt_parser *xt );
    9090struct xt_node *xt_find_node( struct xt_node *node, const char *name );
     91struct xt_node *xt_find_path( struct xt_node *node, const char *name );
    9192char *xt_find_attr( struct xt_node *node, const char *key );
    9293
Note: See TracChangeset for help on using the changeset viewer.