Object
|
+---DTree
|
+---DXMLTree
The XML Tree class implements methods for reading, storing, changing, removing and writing xml information. Due to the fact that every xml piece of information is stored in a xml node, large xml files can take a lot of memory. Unparsed information is not stored in the tree. Use a character that can't be part of an URI e.g. '|' for the namespace separator.
#include <stdio.h>
#include "ofc/DXML.h"
#include "ofc/DFile.h"
int main(int argc, char *argv[])
{
DXMLTree *tree = [DXMLTree new];
DFile *file = [DFile new];
DTreeIterator *iter = [DTreeIterator alloc];
DXMLNode *node;
char name1[] = "example.xml";
char name2[] = "exampl2.xml";
if ([file open :name1 :"r"]) // Open the xml file for reading
{
if ([tree read :file :name1 :'|']) // Read the file into the tree
{
printf("File \"%s\" succesfully read in XML tree.\n", name1);
[file close];
printf("XML-nodes in tree:%ld\n", [tree length]);
[iter init :tree]; // Use the tree
node = [iter root];
while (node != nil)
{
switch ([node type]) // Print node info
{
case DXML_ELEMENT : printf("Element:%s\n", [node name]); break;
case DXML_ATTRIBUTE : printf("Attribute:%s - %s\n", [node name], [node value]); break;
case DXML_TEXT : printf("Text:%s\n", [node value]); break;
case DXML_CDATA : printf("CDATA:%s\n", [node value]); break;
case DXML_ENTITY_REF : break;
case DXML_ENTITY : break;
case DXML_PI : break;
case DXML_COMMENT : printf("Comment:%s\n", [node value]); break;
case DXML_DOCUMENT : printf("Document:%s\n", [node value]); break;
case DXML_DOC_TYPE : break;
case DXML_DOC_FRAGMENT: break;
case DXML_NOTATION : break;
case DXML_NAMESPACE : break;
}
if ([iter hasChildren]) // Move to the next node
{
node = [iter child];
}
else if ([iter isLast])
{
node = [iter parent];
if (node != nil)
node = [iter next];
}
else
{
node = [iter next];
}
}
if ([file open :name2 :"w"]) // Open the destination file for writing
{
if ([tree write :file :name2]) // Write the tree to the file
printf("Xml tree succesfully written to \"%s\".\n", name2);
else
printf("Could not write the xml tree file \"%s\".\n", name2);
[file close];
}
else
printf("Could not open \"%s\" for writing:%d\n", name2, [file error]);
}
else
{
printf("Could not read the xml file.\n");
[file close];
}
}
else
printf("Could not open \"%s\":%d\n", name1, [file error]);
[tree free]; // Cleanup
[file free];
[iter free];
return 0;
}