## IpatchXml

IpatchXml — XML tree functions

## Stability Level

Stable, unless otherwise indicated

## Synopsis

                        IpatchXmlNode;
                        IpatchXmlAttr;
    GNode *             ipatch_xml_new_node                 (GNode *parent,
                                                             const char *name,
                                                             const char *value,
                                                             const char *attr_name,
                                                             ...);
    GNode *             ipatch_xml_new_node_strv            (GNode *parent,
                                                             const char *name,
                                                             const char *value,
                                                             const char **attr_names,
                                                             const char **attr_values);
    gpointer            ipatch_xml_get_data                 (GNode *node,
                                                             const char *key);
    void                ipatch_xml_set_data                 (GNode *node,
                                                             const char *key,
                                                             gpointer data);
    void                ipatch_xml_set_data_full            (GNode *node,
                                                             const char *key,
                                                             gpointer data,
                                                             GDestroyNotify destroy_func);
    gpointer            ipatch_xml_steal_data               (GNode *node,
                                                             const char *key);
    gpointer            ipatch_xml_get_qdata                (GNode *node,
                                                             GQuark quark);
    void                ipatch_xml_set_qdata                (GNode *node,
                                                             GQuark quark,
                                                             gpointer data);
    void                ipatch_xml_set_qdata_full           (GNode *node,
                                                             GQuark quark,
                                                             gpointer data,
                                                             GDestroyNotify destroy_func);
    gpointer            ipatch_xml_steal_qdata              (GNode *node,
                                                             GQuark quark);
    void                ipatch_xml_destroy                  (GNode *node);
    GNode *             ipatch_xml_copy                     (GNode *node);
    void                ipatch_xml_set_name                 (GNode *node,
                                                             const char *name);
    void                ipatch_xml_set_value                (GNode *node,
                                                             const char *value);
    void                ipatch_xml_set_value_printf         (GNode *node,
                                                             const char *format,
                                                             ...);
    void                ipatch_xml_take_name                (GNode *node,
                                                             char *name);
    void                ipatch_xml_take_value               (GNode *node,
                                                             char *value);
    const char *        ipatch_xml_get_name                 (GNode *node);
    gboolean            ipatch_xml_test_name                (GNode *node,
                                                             const char *cmpname);
    const char *        ipatch_xml_get_value                (GNode *node);
    char *              ipatch_xml_dup_value                (GNode *node);
    gboolean            ipatch_xml_test_value               (GNode *node,
                                                             const char *cmpvalue);
    void                ipatch_xml_set_attribute            (GNode *node,
                                                             const char *attr_name,
                                                             const char *attr_value);
    void                ipatch_xml_set_attributes           (GNode *node,
                                                             const char *attr_name,
                                                             const char *attr_value,
                                                             const char *attr2_name,
                                                             ...);
    const char *        ipatch_xml_get_attribute            (GNode *node,
                                                             const char *name);
    gboolean            ipatch_xml_test_attribute           (GNode *node,
                                                             const char *attr_name,
                                                             const char *cmpval);
    GNode *             ipatch_xml_find_child               (GNode *node,
                                                             const char *name);
    GNode *             ipatch_xml_find_by_path             (GNode *node,
                                                             const char *path);
    char *              ipatch_xml_to_str                   (GNode *node,
                                                             guint indent);
    gboolean            ipatch_xml_save_to_file             (GNode *node,
                                                             guint indent,
                                                             const char *filename,
                                                             GError **err);
    GNode *             ipatch_xml_from_str                 (const char *str,
                                                             GError **err);
    GNode *             ipatch_xml_load_from_file           (const char *filename,
                                                             GError **err);
    IpatchXmlNode *     ipatch_xml_node_new                 (void);
    void                ipatch_xml_node_free                (IpatchXmlNode *node);
    IpatchXmlNode *     ipatch_xml_node_duplicate           (const IpatchXmlNode *xmlnode);
    IpatchXmlAttr *     ipatch_xml_attr_new                 (void);
    void                ipatch_xml_attr_free                (IpatchXmlAttr *attr);
    IpatchXmlAttr *     ipatch_xml_attr_duplicate           (const IpatchXmlAttr *attr);

## Description

Functions for manipulating XML node trees and saving/loading to/from XML content in strings or files. XML node trees use the glib GNode N-ary tree data type for added flexibility.

## Details

### IpatchXmlNode

    typedef struct {
      char *name;		/* XML element name */
      char *value;		/* Text content of element */
      GData *qdata;		/* To associate arbitrary data with XML nodes */
      GList *attributes;	/* List of IpatchXmlAttr structures */
    } IpatchXmlNode;

An XML element node. Note that a given node can contain only one text value.

char *`name`; | XML element name
char *`value`; | XML text value or `NULL`
GData *`qdata`; |
GList *`attributes`; | Linked list of IpatchXmlAttr structures

### IpatchXmlAttr

    typedef struct {
      char *name;
      char *value;
    } IpatchXmlAttr;

Structure for storing an XML attribute.

char *`name`; | Attribute name
char *`value`; | Attribute value

### ipatch_xml_new_node ()

    GNode *             ipatch_xml_new_node                 (GNode *parent,
                                                             const char *name,
                                                             const char *value,
                                                             const char *attr_name,
                                                             ...);

Create a new XML tree node and append it to the given `parent`, if supplied. Note that the returned GNode can be used with other N-Array glib operations.

`parent` : | Parent node to add new node to as a child, or `NULL` to create new root node
`name` : | Name of the new XML node
`value` : | Text value to assign to the new node or `NULL`
`attr_name` : | First attribute name to assign or `NULL`
`...` : | If `attr_name` was supplied first string value to be assigned should be the first parameter, additional name/value attribute string pairs may follow terminated by a `NULL` name.
Returns : | New XML tree node

### ipatch_xml_new_node_strv ()

    GNode *             ipatch_xml_new_node_strv            (GNode *parent,
                                                             const char *name,
                                                             const char *value,
                                                             const char **attr_names,
                                                             const char **attr_values);

Like `ipatch_xml_new_node()` but takes attribute name/values as separate strv arrays.

`parent` : | Parent node to add new node to as a child, or `NULL` to create new root node
`name` : | Name of the new XML node
`value` : | Text value to assign to the new node or `NULL`
`attr_names` : | `NULL` terminated array of attribute names or `NULL`
`attr_values` : | `NULL` terminated array of attribute values or `NULL`
Returns : | New XML tree node

### ipatch_xml_get_data ()

    gpointer            ipatch_xml_get_data                 (GNode *node,
                                                             const char *key);

Lookup data assigned to an XML node using a quark. This is faster than `ipatch_xml_get_data()` since the key must be converted to a quark anyways.

`node` : | XML node
`quark` : | Quark key
Returns : | The data pointer or `NULL` if not set

### ipatch_xml_set_data ()

    void                ipatch_xml_set_data                 (GNode *node,
                                                             const char *key,
                                                             gpointer data);

Assigns arbitrary data to an XML node specified by a `key`.

`node` : | XML node
`key` : | Name of the key
`data` : | Data to associate with the key

### ipatch_xml_set_data_full ()

    void                ipatch_xml_set_data_full            (GNode *node,
                                                             const char *key,
                                                             gpointer data,
                                                             GDestroyNotify destroy_func);

Assigns arbitrary data to an XML node specified by a `key`. Also assigns a `destroy_func` callback to destroy the data when it is removed.

`node` : | XML node
`key` : | Name of the key
`data` : | Data to associate with the key

### ipatch_xml_steal_data ()

    gpointer            ipatch_xml_steal_data               (GNode *node,
                                                             const char *key);

Remove keyed data from an XML node, but don't call the data's destroy notify. Caller is thus given the ownership of the data.

`node` : | XML node
`key` : | Name of the key
Returns : | The data pointer or `NULL` if not set

### ipatch_xml_get_qdata ()

    gpointer            ipatch_xml_get_qdata                (GNode *node,
                                                             GQuark quark);

### ipatch_xml_set_qdata ()

    void                ipatch_xml_set_qdata                (GNode *node,
                                                             GQuark quark,
                                                             gpointer data);

Assigns arbitrary data to an XML node specified by a `quark` key. This is faster than `ipatch_xml_set_data()` since the key must be converted to a quark anyways.

`node` : | XML node
`quark` : | Quark key
`data` : | Data to associate with the key

### ipatch_xml_set_qdata_full ()

    void                ipatch_xml_set_qdata_full           (GNode *node,
                                                             GQuark quark,
                                                             gpointer data,
                                                             GDestroyNotify destroy_func);

Assigns arbitrary data to an XML node specified by a `key`. Also assigns a `destroy_func` callback to destroy the data when it is removed. This is faster than `ipatch_xml_set_data_full()` since the key must be converted to a quark anyways.

`node` : | XML node
`quark` : | Quark key
`data` : | Data to associate with the key

### ipatch_xml_steal_qdata ()

    gpointer            ipatch_xml_steal_qdata              (GNode *node,
                                                             GQuark quark);

Remove keyed data from an XML node, but don't call the data's destroy notify. Caller is thus given the ownership of the data. This is faster than `ipatch_xml_steal_data()` since the key must be converted to a quark anyways.

`node` : | XML node
`quark` : | Quark key
Returns : | The data pointer or `NULL` if not set

### ipatch_xml_destroy ()

    void                ipatch_xml_destroy                  (GNode *node);

Free an XML tree (a root `node` and all its children). Does not need to be the actual root of a tree, i.e., can remove a sub tree.

`node` : | Root of XML tree/sub tree to destroy

### ipatch_xml_copy ()

    GNode *             ipatch_xml_copy                     (GNode *node);

Perform a deep copy on an XML tree.

`node` : | XML tree to copy
Returns : | New duplicate XML tree.

### ipatch_xml_set_name ()

    void                ipatch_xml_set_name                 (GNode *node,
                                                             const char *name);

Set the name of an XML node.

`node` : | XML node
`name` : | Name to assign

### ipatch_xml_set_value ()

    void                ipatch_xml_set_value                (GNode *node,
                                                             const char *value);

Set the text value of an XML node.

`node` : | XML node
`value` : | Text value to assign or `NULL` to clear it

### ipatch_xml_set_value_printf ()

    void                ipatch_xml_set_value_printf         (GNode *node,
                                                             const char *format,
                                                             ...);

Assign a value to an XML node using a printf format and arguments.

`node` : | XML node
`format` : | Printf format
`...` : | Printf arguments

### ipatch_xml_take_name ()

    void                ipatch_xml_take_name                (GNode *node,
                                                             char *name);

Like `ipatch_xml_set_name()` but takes over the allocation of `name` rather than duplicating it.

`node` : | XML node
`name` : | Name to assign or `NULL` to clear it

### ipatch_xml_take_value ()

    void                ipatch_xml_take_value               (GNode *node,
                                                             char *value);

Like `ipatch_xml_set_value()` but takes over the allocation of `value` rather than duplicating it.

`node` : | XML node
`value` : | Text value to assign

### ipatch_xml_get_name ()

    const char *        ipatch_xml_get_name                 (GNode *node);

Get the name of an XML node.

`node` : | XML node to get name of
Returns : | Name of XML node which is internal and should not be modified or freed.

### ipatch_xml_test_name ()

    gboolean            ipatch_xml_test_name                (GNode *node,
                                                             const char *cmpname);

Test if the node has the given name.

`node` : | XML node to get name of
`cmpname` : | Name to compare to
Returns : | `TRUE` if the node has the given name, `FALSE` otherwise

### ipatch_xml_get_value ()

    const char *        ipatch_xml_get_value                (GNode *node);

Get the text value of an XML node.

`node` : | XML node to get value of
Returns : | Value of XML node or `NULL`, which is internal and should not be modified or freed.

### ipatch_xml_dup_value ()

    char *              ipatch_xml_dup_value                (GNode *node);

Duplicate the text value of an XML node. Like `ipatch_xml_get_value()` but makes a copy of the value which the caller owns.

`node` : | XML node to duplicate value of
Returns : | Newly allocated duplicate value of XML node or `NULL`.

### ipatch_xml_test_value ()

    gboolean            ipatch_xml_test_value               (GNode *node,
                                                             const char *cmpvalue);

Test if the node has the given value.

`node` : | XML node to get name of
`cmpvalue` : | Value to compare to
Returns : | `TRUE` if the node has the given value, `FALSE` otherwise

### ipatch_xml_set_attribute ()

    void                ipatch_xml_set_attribute            (GNode *node,
                                                             const char *attr_name,
                                                             const char *attr_value);

Set or unset an attribute of an XML node. If there is already an existing attribute with the given `attr_name`, its value will be replaced.

`node` : | XML node
`attr_name` : | Attribute name to assign to
`attr_value` : | Attribute value to assign or `NULL` to unset

### ipatch_xml_set_attributes ()

    void                ipatch_xml_set_attributes           (GNode *node,
                                                             const char *attr_name,
                                                             const char *attr_value,
                                                             const char *attr2_name,
                                                             ...);

Set one or more attributes of an XML node.

`node` : | XML node
`attr_name` : | First attribute name
`attr_value` : | First attribute value
`...` : | Additional name/value attribute strings, terminated by a `NULL` name

### ipatch_xml_get_attribute ()

    const char *        ipatch_xml_get_attribute            (GNode *node,
                                                             const char *name);

Get the value of an attribute of an XML node.

`node` : | XML node
`attr_name` : | Name of attribute
Returns : | Value of the named attribute or `NULL` if not found, value is internal and should not be modified or freed.

### ipatch_xml_test_attribute ()

    gboolean            ipatch_xml_test_attribute           (GNode *node,
                                                             const char *attr_name,
                                                             const char *cmpval);

Test if an attribute of an XML node is a given value or exists (`cmpval` = `NULL`).

`node` : | XML node
`attr_name` : | Name of attribute
`cmpval` : | Value to compare attribute to (`NULL` to just check existence).
Returns : | `TRUE` if attribute exists and matches `cmpval` (if set).

### ipatch_xml_find_child ()

    GNode *             ipatch_xml_find_child               (GNode *node,
                                                             const char *name);

Find a child node with the given `name`. Only searches the children of `node` and does not search recursively.

`node` : | XML node
`name` : | Node name of child to find
Returns : | Matching node or `NULL` if not found.

### ipatch_xml_find_by_path ()

    GNode *             ipatch_xml_find_by_path             (GNode *node,
                                                             const char *path);

Get a node in a tree from a path string.

`node` : | XML node
`path` : | Path specification in the form "name1.name2.name3" where each child of a node is separated by a '.' character.
Returns : | Matching node or `NULL` if not found.

### ipatch_xml_to_str ()

    char *              ipatch_xml_to_str                   (GNode *node,
                                                             guint indent);

Render an XML tree to a string.

`node` : | XML node
`indent` : | Number of spaces of indent per level (0 for no indent)
Returns : | Newly allocated string of XML content representing `node`, free with `g_free()` when done using it.

### ipatch_xml_save_to_file ()

    gboolean            ipatch_xml_save_to_file             (GNode *node,
                                                             guint indent,
                                                             const char *filename,
                                                             GError **err);

Store an XML tree to a file.

`node` : | XML tree to save
`indent` : | Number of spaces to indent per level
`filename` : | File name to save to
`err` : | Location to store error info or `NULL` to ignore
Returns : | `TRUE` on success, `FALSE` otherwise (in which case `err` may be set)

### ipatch_xml_from_str ()

    GNode *             ipatch_xml_from_str                 (const char *str,
                                                             GError **err);

Parse XML content into an XML node tree.

`str` : | XML content to parse
`err` : | Location to store error info or `NULL` to ignore
Returns : | Newly allocated XML node tree or `NULL` on error (`err` may be set), can be freed with `ipatch_xml_destroy()`.

### ipatch_xml_load_from_file ()

    GNode *             ipatch_xml_load_from_file           (const char *filename,
                                                             GError **err);

Parse an XML file into an XML node tree.

`filename` : | File name containing XML content to parse
`err` : | Location to store error info or `NULL` to ignore
Returns : | Newly allocated XML node tree or `NULL` on error (`err` may be set), can be freed with `ipatch_xml_destroy()`.

### ipatch_xml_node_new ()

    IpatchXmlNode *     ipatch_xml_node_new                 (void);

Create a new XML node structure. Not normally used.

Returns : | New XML node structure, which should be added to a GNode.

### ipatch_xml_node_free ()

    void                ipatch_xml_node_free                (IpatchXmlNode *node);

Free an XML node structure and its contents. Not normally used.

`xmlnode` : | XML node structure to free

### ipatch_xml_node_duplicate ()

    IpatchXmlNode *     ipatch_xml_node_duplicate           (const IpatchXmlNode *xmlnode);

Duplicate an XML node structure and its contents. Not normally used. Note that arbitrary user data assigned to the XML node will not be duplicated.

`xmlnode` : | XML node structure to duplicate
Returns : | New duplicate of `xmlnode`.

### ipatch_xml_attr_new ()

    IpatchXmlAttr *     ipatch_xml_attr_new                 (void);

Create a new XML attribute structure. Not normally used.

Returns : | New XML attribute structure which should be added to an IpatchXmlNode attributes list.

### ipatch_xml_attr_free ()

    void                ipatch_xml_attr_free                (IpatchXmlAttr *attr);

Free an XML attribute structure. Not normally used.

`attr` : | Attribute structure to free

### ipatch_xml_attr_duplicate ()

    IpatchXmlAttr *     ipatch_xml_attr_duplicate           (const IpatchXmlAttr *attr);

Duplicate an XML attribute structure. Not normally used.

`attr` : | Attribute structure to duplicate
Returns : | New duplicate attribute structure

## See Also

IpatchXmlObject