2007-11-23 02:15:07 +00:00
|
|
|
README - 2007-11-22
|
2003-06-03 19:46:29 +00:00
|
|
|
-------------------
|
|
|
|
|
|
|
|
|
|
|
|
INTRODUCTION
|
|
|
|
|
2007-11-23 02:15:07 +00:00
|
|
|
This README file describes the Mini-XML library version 2.4.
|
2003-06-03 20:40:01 +00:00
|
|
|
|
2003-06-03 19:46:29 +00:00
|
|
|
Mini-XML is a small XML parsing library that you can use to
|
|
|
|
read XML and XML-like data files in your application without
|
|
|
|
requiring large non-standard libraries. Mini-XML only
|
|
|
|
requires an ANSI C compatible compiler (GCC works, as do
|
|
|
|
most vendors' ANSI C compilers) and a "make" program.
|
|
|
|
|
2003-06-04 17:37:23 +00:00
|
|
|
Mini-XML provides the following functionality:
|
|
|
|
|
2004-05-21 02:59:52 +00:00
|
|
|
- Reading of UTF-8 and UTF-16 and writing of UTF-8
|
|
|
|
encoded XML files and strings.
|
2003-06-04 17:37:23 +00:00
|
|
|
- Data is stored in a linked-list tree structure,
|
|
|
|
preserving the XML data hierarchy.
|
|
|
|
- Supports arbitrary element names, attributes, and
|
|
|
|
attribute values with no preset limits, just available
|
|
|
|
memory.
|
|
|
|
- Supports integer, real, opaque ("cdata"), and text
|
|
|
|
data types in "leaf" nodes.
|
|
|
|
- Functions for creating and managing trees of data.
|
|
|
|
- "Find" and "walk" functions for easily locating and
|
|
|
|
navigating trees of data.
|
|
|
|
|
|
|
|
Mini-XML doesn't do validation or other types of processing
|
|
|
|
on the data based upon schema files or other sources of
|
2004-06-21 10:58:27 +00:00
|
|
|
definition information.
|
2003-06-03 19:46:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
BUILDING Mini-XML
|
|
|
|
|
|
|
|
Mini-XML comes with an autoconf-based configure script; just
|
|
|
|
type the following command to get things going:
|
|
|
|
|
|
|
|
./configure
|
|
|
|
|
|
|
|
The default install prefix is /usr/local, which can be
|
|
|
|
overridden using the --prefix option:
|
|
|
|
|
|
|
|
./configure --prefix=/foo
|
|
|
|
|
2003-09-29 01:14:51 +00:00
|
|
|
Other configure options can be found using the --help
|
|
|
|
option:
|
|
|
|
|
|
|
|
./configure --help
|
|
|
|
|
2003-06-03 19:46:29 +00:00
|
|
|
Once you have configured the software, type "make" to do the
|
2003-06-05 13:49:14 +00:00
|
|
|
build and run the test program to verify that things are
|
|
|
|
working, as follows:
|
2003-06-03 19:46:29 +00:00
|
|
|
|
|
|
|
make
|
|
|
|
|
2004-06-21 10:58:27 +00:00
|
|
|
If you are using Mini-XML under Microsoft Windows with
|
|
|
|
Visual C++, use the included project files in the "vcnet"
|
2004-06-21 11:17:52 +00:00
|
|
|
subdirectory to build the library instead.
|
2004-06-21 10:58:27 +00:00
|
|
|
|
2003-06-03 19:46:29 +00:00
|
|
|
|
|
|
|
INSTALLING Mini-XML
|
|
|
|
|
|
|
|
The "install" target will install Mini-XML in the lib and
|
|
|
|
include directories:
|
|
|
|
|
|
|
|
make install
|
|
|
|
|
|
|
|
Once you have installed it, use the "-lmxml" option to link
|
|
|
|
your application against it.
|
|
|
|
|
|
|
|
|
|
|
|
DOCUMENTATION
|
|
|
|
|
2004-05-02 16:04:40 +00:00
|
|
|
The documentation is available in the "doc" subdirectory in
|
|
|
|
the files "mxml.html" (HTML) and "mxml.pdf" (PDF). You can
|
|
|
|
also look at the "testmxml.c" and "mxmldoc.c" source files
|
|
|
|
for examples of using Mini-XML.
|
2003-06-03 19:46:29 +00:00
|
|
|
|
|
|
|
Mini-XML provides a single header file which you include:
|
|
|
|
|
|
|
|
#include <mxml.h>
|
|
|
|
|
|
|
|
Nodes are defined by the "mxml_node_t" structure; the "type"
|
|
|
|
member defines the node type (element, integer, opaque,
|
|
|
|
real, or text) which determines which value you want to look
|
|
|
|
at in the "value" union. New nodes can be created using the
|
|
|
|
"mxmlNewElement()", "mxmlNewInteger()", "mxmlNewOpaque()",
|
|
|
|
"mxmlNewReal()", and "mxmlNewText()" functions. Only
|
|
|
|
elements can have child nodes, and the top node must be an
|
|
|
|
element, usually "?xml".
|
|
|
|
|
|
|
|
You load an XML file using the "mxmlLoadFile()" function:
|
|
|
|
|
|
|
|
FILE *fp;
|
|
|
|
mxml_node_t *tree;
|
|
|
|
|
|
|
|
fp = fopen("filename.xml", "r");
|
|
|
|
tree = mxmlLoadFile(NULL, fp, MXML_NO_CALLBACK);
|
|
|
|
fclose(fp);
|
|
|
|
|
|
|
|
Similarly, you save an XML file using the "mxmlSaveFile()"
|
|
|
|
function:
|
|
|
|
|
|
|
|
FILE *fp;
|
|
|
|
mxml_node_t *tree;
|
|
|
|
|
|
|
|
fp = fopen("filename.xml", "w");
|
2003-06-04 17:37:23 +00:00
|
|
|
mxmlSaveFile(tree, fp, MXML_NO_CALLBACK);
|
2003-06-03 19:46:29 +00:00
|
|
|
fclose(fp);
|
|
|
|
|
2003-07-22 10:29:19 +00:00
|
|
|
The "mxmlLoadString()", "mxmlSaveAllocString()", and
|
|
|
|
"mxmlSaveString()" functions load XML node trees from and
|
|
|
|
save XML node trees to strings:
|
|
|
|
|
|
|
|
char buffer[8192];
|
|
|
|
char *ptr;
|
|
|
|
mxml_node_t *tree;
|
|
|
|
|
|
|
|
...
|
|
|
|
tree = mxmlLoadString(NULL, buffer, MXML_NO_CALLBACK);
|
|
|
|
|
|
|
|
...
|
|
|
|
mxmlSaveString(tree, buffer, sizeof(buffer), MXML_NO_CALLBACK);
|
|
|
|
|
|
|
|
...
|
|
|
|
ptr = mxmlSaveAllocString(tree, MXML_NO_CALLBACK);
|
|
|
|
|
2003-06-03 19:46:29 +00:00
|
|
|
You can find a named element/node using the
|
|
|
|
"mxmlFindElement()" function:
|
|
|
|
|
2003-06-04 16:30:40 +00:00
|
|
|
mxml_node_t *node = mxmlFindElement(tree, tree, "name", "attr",
|
|
|
|
"value", MXML_DESCEND);
|
|
|
|
|
|
|
|
The "name", "attr", and "value" arguments can be passed as
|
|
|
|
NULL to act as wildcards, e.g.:
|
|
|
|
|
|
|
|
/* Find the first "a" element */
|
|
|
|
node = mxmlFindElement(tree, tree, "a", NULL, NULL, MXML_DESCEND);
|
|
|
|
|
|
|
|
/* Find the first "a" element with "href" attribute */
|
|
|
|
node = mxmlFindElement(tree, tree, "a", "href", NULL, MXML_DESCEND);
|
|
|
|
|
|
|
|
/* Find the first "a" element with "href" to a URL */
|
|
|
|
node = mxmlFindElement(tree, tree, "a", "href",
|
|
|
|
"http://www.easysw.com/~mike/mxml/",
|
|
|
|
MXML_DESCEND);
|
|
|
|
|
|
|
|
/* Find the first element with a "src" attribute*/
|
|
|
|
node = mxmlFindElement(tree, tree, NULL, "src", NULL, MXML_DESCEND);
|
|
|
|
|
|
|
|
/* Find the first element with a "src" = "foo.jpg" */
|
|
|
|
node = mxmlFindElement(tree, tree, NULL, "src", "foo.jpg",
|
|
|
|
MXML_DESCEND);
|
2003-06-03 19:46:29 +00:00
|
|
|
|
|
|
|
You can also iterate with the same function:
|
|
|
|
|
|
|
|
mxml_node_t *node;
|
|
|
|
|
2003-06-04 16:30:40 +00:00
|
|
|
for (node = mxmlFindElement(tree, tree, "name", NULL, NULL,
|
|
|
|
MXML_DESCEND);
|
2003-06-03 19:46:29 +00:00
|
|
|
node != NULL;
|
2003-06-04 16:30:40 +00:00
|
|
|
node = mxmlFindElement(node, tree, "name", NULL, NULL,
|
|
|
|
MXML_DESCEND))
|
2003-06-03 19:46:29 +00:00
|
|
|
{
|
|
|
|
... do something ...
|
|
|
|
}
|
|
|
|
|
|
|
|
Finally, once you are done with the XML data, use the
|
2003-06-03 20:24:28 +00:00
|
|
|
"mxmlDelete()" function to recursively free the memory that
|
|
|
|
is used for a particular node or the entire tree:
|
2003-06-03 19:46:29 +00:00
|
|
|
|
|
|
|
mxmlDelete(tree);
|
|
|
|
|
|
|
|
|
|
|
|
GETTING HELP AND REPORTING PROBLEMS
|
|
|
|
|
|
|
|
You can email me at "mxml@easysw.com" to report problems
|
|
|
|
and/or ask for help. Just don't expect an instant response,
|
|
|
|
as I get a *lot* of email...
|
|
|
|
|
|
|
|
|
|
|
|
LEGAL STUFF
|
|
|
|
|
2007-04-18 14:55:08 +00:00
|
|
|
The Mini-XML library is Copyright 2003-2007 by Michael Sweet.
|
2003-06-03 19:46:29 +00:00
|
|
|
|
|
|
|
This library is free software; you can redistribute it
|
|
|
|
and/or modify it under the terms of the GNU Library General
|
|
|
|
Public License as published by the Free Software Foundation;
|
|
|
|
either version 2 of the License, or (at your option) any
|
|
|
|
later version.
|
|
|
|
|
|
|
|
This library is distributed in the hope that it will be
|
|
|
|
useful, but WITHOUT ANY WARRANTY; without even the implied
|
|
|
|
warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
|
|
PURPOSE. See the GNU Library General Public License for
|
|
|
|
more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU Library General
|
|
|
|
Public License along with this library; if not, write to the
|
|
|
|
Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA
|
|
|
|
02139, USA.
|