Nodes can now have values AND subnodes

This commit is contained in:
2005-04-06 11:17:02 +00:00
parent ac83fc6a81
commit 7365c4b122
2 changed files with 35 additions and 43 deletions
+31 -43
View File
@@ -37,6 +37,9 @@
deleting nodes.
$Log$
Revision 1.7 2005/04/06 11:17:02 ritt
Nodes can now have values AND subnodes
Revision 1.6 2005/03/29 15:11:56 ritt
Close element before writing comment
@@ -380,7 +383,7 @@ int mxml_set_translate(MXML_WRITER *writer, int flag)
}
/*------------------------------------------------------------------*/
int mxml_start_element(MXML_WRITER *writer, const char *name)
int mxml_start_element1(MXML_WRITER *writer, const char *name, int indent)
/* start a new XML element, must be followed by mxml_end_elemnt */
{
int i;
@@ -392,8 +395,9 @@ int mxml_start_element(MXML_WRITER *writer, const char *name)
}
line[0] = 0;
for (i=0 ; i<writer->level ; i++)
strlcat(line, XML_INDENT, sizeof(line));
if (indent)
for (i=0 ; i<writer->level ; i++)
strlcat(line, XML_INDENT, sizeof(line));
strlcat(line, "<", sizeof(line));
strlcpy(name_enc, name, sizeof(name_enc));
mxml_encode(name_enc, sizeof(name_enc), writer->translate);
@@ -416,6 +420,20 @@ int mxml_start_element(MXML_WRITER *writer, const char *name)
/*------------------------------------------------------------------*/
int mxml_start_element(MXML_WRITER *writer, const char *name)
{
return mxml_start_element1(writer, name, TRUE);
}
/*------------------------------------------------------------------*/
int mxml_start_element_noindent(MXML_WRITER *writer, const char *name)
{
return mxml_start_element1(writer, name, FALSE);
}
/*------------------------------------------------------------------*/
int mxml_end_element(MXML_WRITER *writer)
/* close an open XML element */
{
@@ -628,7 +646,7 @@ PMXML_NODE mxml_add_special_node_at(PMXML_NODE parent, int node_type, char *node
parent->n_children++;
if (value) {
if (value && *value) {
pnode->value = (char *)malloc(strlen(value)+1);
assert(pnode->value);
strcpy(pnode->value, value);
@@ -1425,23 +1443,23 @@ PMXML_NODE mxml_parse_file(char *file_name, char *error, int error_size)
/*------------------------------------------------------------------*/
int mxml_write_subtree(MXML_WRITER *writer, PMXML_NODE tree)
int mxml_write_subtree(MXML_WRITER *writer, PMXML_NODE tree, int indent)
/* write complete subtree recursively into file opened with mxml_open_document() */
{
int i;
mxml_start_element(writer, tree->name);
mxml_start_element1(writer, tree->name, indent);
for (i=0 ; i<tree->n_attributes ; i++)
if (!mxml_write_attribute(writer, tree->attribute_name+i*MXML_NAME_LENGTH, tree->attribute_value[i]))
return FALSE;
if (tree->value) {
if (tree->value)
if (!mxml_write_value(writer, tree->value))
return FALSE;
} else {
for (i=0 ; i<tree->n_children ; i++)
if (!mxml_write_subtree(writer, &tree->child[i]))
return FALSE;
}
for (i=0 ; i<tree->n_children ; i++)
if (!mxml_write_subtree(writer, &tree->child[i], (tree->value == NULL) || i > 0))
return FALSE;
return mxml_end_element(writer);
}
@@ -1461,7 +1479,7 @@ int mxml_write_tree(char *file_name, PMXML_NODE tree)
for (i=0 ; i<tree->n_children ; i++)
if (tree->child[i].node_type == ELEMENT_NODE) // skip PI and comments
if (!mxml_write_subtree(writer, &tree->child[i]))
if (!mxml_write_subtree(writer, &tree->child[i], TRUE))
return FALSE;
if (!mxml_close_file(writer))
@@ -1543,33 +1561,3 @@ void mxml_free_tree(PMXML_NODE tree)
}
/*------------------------------------------------------------------*/
void mxml_test()
{
char err[256];
PMXML_NODE tree, *node;
int i, n;
MXML_WRITER *writer;
writer = mxml_open_file("c:\\tmp\\test.xml");
mxml_start_element(writer, "odb");
mxml_start_element(writer, "dir");
mxml_write_value(writer, "contents");
mxml_end_element(writer);
mxml_write_comment(writer, "comment");
mxml_end_element(writer);
mxml_close_file(writer);
tree = mxml_parse_file("c:\\online\\odb.xml", err, sizeof(err));
node = NULL;
n = mxml_find_nodes(tree, "/odb/dir[@name=\"Experiment\"]/dir[@name='Run Parameters']/key[@name='Comment']", &node);
for (i=0 ; i<n ; i++)
printf("%s\n", node[i]->value);
mxml_debug_tree(*node, 0);
free(node);
mxml_debug_tree(tree, 0);
mxml_free_tree(tree);
}
+4
View File
@@ -6,6 +6,9 @@
Contents: Header file for mxml.c
$Log$
Revision 1.4 2005/04/06 11:17:02 ritt
Nodes can now have values AND subnodes
Revision 1.3 2005/03/29 14:48:54 ritt
Implemented mxml_write_comment()
@@ -60,6 +63,7 @@ MXML_WRITER *mxml_open_file(const char *file_name);
MXML_WRITER *mxml_open_buffer(void);
int mxml_set_translate(MXML_WRITER *writer, int flag);
int mxml_start_element(MXML_WRITER *writer, const char *name);
int mxml_start_element_noindent(MXML_WRITER *writer, const char *name);
int mxml_end_element(MXML_WRITER *writer);
int mxml_write_comment(MXML_WRITER *writer, const char *string);
int mxml_write_attribute(MXML_WRITER *writer, const char *name, const char *value);